Pedro is suggesting a way for a Haskell type-level program to gain access to role information. This might indeed be useful, but it doesn't seem terribly related to the problem of defaults / abstraction. The problem has to do with definitions like these:
> module A where
> data S a b = S1 a | S2 b
> data T a b = MkT (S a b)
> module B where
> import A ( {- what goes here? -} )
>
> class C a where
> mkT :: T Bool a
>
> instance C Int where ...
> newtype Age = MkAge Int deriving C
What constructors do we need in order to convert the (C Int) instance to (C Age) by hand? To me, it looks like we need MkT and S2, but not S1. Yet, this is not obvious and seems to be quite confusing.
I hope this helps understanding the issue!
Richard