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