Hi Tom,
It looks like after a type variable is hidden (existentially quantified is probably the term), you don't get it back to pick the more specific instance. Here's a shorter example than yours:
{-# LANGUAGE FlexibleInstances, GADTs #-}
class C a where c :: a -> String
instance {-# OVERLAPPABLE #-} C a where c _ = "fallback"
instance {-# OVERLAPS #-} C Char where c _ = "char"
data T where T :: a -> T
example = case T 'x' of T x -> c x
-- prints "fallback"
In this example you can change the T constructor to T :: C a => a -> T to get "char" printed, but I can't figure the equivalent of that for your class. The closest I can get is to store the Typeable dictionary with the Compose constructor <
http://lpaste.net/9086245683987480576> which would let you return "yes" when the wrong instance is chosen. But then if you have Typeable you probably don't need overlapping instances.
Regards,
Adam