diff git a/compiler/typecheck/TcTyClsDecls.hs b/compiler/typecheck/TcTyClsDecls.hs
index 034ff6f6ee0e0810f606883a84258d2bb9866c2b..f6d4085c387a51236955e27d9b9b44752a241d15 100644
 a/compiler/typecheck/TcTyClsDecls.hs
+++ b/compiler/typecheck/TcTyClsDecls.hs
@@ 221,12 +221,6 @@ Kind checking is done thus:
3. Kind check the data type and class decls
Synonyms are treated differently to data type and classes,
because a type synonym can be an unboxed type
 type Foo = Int#
and a kind variable can't unify with UnboxedTypeKind
So we infer their kinds in dependency order

We need to kind check all types in the mutually recursive group
before we know the kind of the type variables. For example:
@@ 245,9 +239,16 @@ just involve (>) and *:
type R = Int#  Kind #
type S a = Array# a  Kind * > #
type T a b = (# a,b #)  Kind * > * > (# a,b #)
So we must infer their kinds from their righthand sides *first* and then
use them, whereas for the mutually recursive data types D we bring into
scope kind bindings D > k, where k is a kind variable, and do inference.
+and a kind variable can't unify with UnboxedTypeKind.
+
+So we must infer the kinds of type synonyms from their righthand
+sides *first* and then use them, whereas for the mutually recursive
+data types D we bring into scope kind bindings D > k, where k is a
+kind variable, and do inference.
+
+NB: synonyms can be mutually recursive with data type declarations though!
+ type T = D > D
+ data D = MkD Int T
Open type families
~~~~~~~~~~~~~~~~~~