Anil is right about one thing. This is a design issue. It is my understanding that the Haskell committee made the decision that given a declaration like class Foo a => Bar a where .. every *instance* declaration for Bar would be statically checked to ensure that a corresponding instance declaration for Foo exists that is at least as general. Now basically, a superclass declaration like the above means that (Bar t) is equivalent to (Bar t, Foo t). In fact this "shorthand" in building contexts seems to be its only purpose. This equivalence can either be enforced "eagerly" as in Haskell or "lazily" as in Gofer. What Anil seems to be saying is that he prefers the lazy enforcement which makes the behavior of superclass contexts in instance declarations more similar to that of contexts in instance declarations. Satish