Consider something like
data Foo a = Foo !Int !a
The data constructor Foo needs to be strict in its arguments, so it'd need Seq Int and Seq a. Seq Int would be resolved by the environment, but Seq a would need to come from somewhere.
data Seq a => Foo a = Foo !Int !a
gives you
Foo :: Seq a => Int -> a -> Foo a
so it is available when evaluating the constructor.
We're not storing the instance as a slot in the constructor, so this isn't.
data Foo a where
Foo :: Seq a => Int -> a -> Foo a
or equivalently
data Foo a = Seq a => Foo !Int !a
This is where the data type contexts came from. They were originally motivated by the needs of the no-longer existent Seq class, and then subverted to make Complex less useful than it otherwise could be. ;)
-Edward