-isSuperKindTyCon other = False
-
-isCoercionTyCon_maybe :: TyCon -> Maybe (Arity, [Type] -> Kind)
-isCoercionTyCon_maybe (CoercionTyCon {tyConArity = ar, coKindFun = rule})
- = Just (ar, rule)
-isCoercionTyCon_maybe other = Nothing
-
-isCoercionTyCon (CoercionTyCon {}) = True
-isCoercionTyCon other = False
+isSuperKindTyCon _ = False
+
+-- | Is this an AnyTyCon?
+isAnyTyCon :: TyCon -> Bool
+isAnyTyCon (AnyTyCon {}) = True
+isAnyTyCon _ = False
+
+-- | Attempt to pull a 'TyCon' apart into the arity and 'coKindFun' of
+-- a coercion 'TyCon'. Returns @Nothing@ if the 'TyCon' is not of the
+-- appropriate kind
+isCoercionTyCon_maybe :: TyCon -> Maybe (Arity, CoTyConDesc)
+isCoercionTyCon_maybe (CoTyCon {tyConArity = ar, coTcDesc = desc})
+ = Just (ar, desc)
+isCoercionTyCon_maybe _ = Nothing
+
+-- | Is this a 'TyCon' that represents a coercion?
+isCoercionTyCon :: TyCon -> Bool
+isCoercionTyCon (CoTyCon {}) = True
+isCoercionTyCon _ = False
+
+-- | Identifies implicit tycons that, in particular, do not go into interface
+-- files (because they are implicitly reconstructed when the interface is
+-- read).
+--
+-- Note that:
+--
+-- * Associated families are implicit, as they are re-constructed from
+-- the class declaration in which they reside, and
+--
+-- * Family instances are /not/ implicit as they represent the instance body
+-- (similar to a @dfun@ does that for a class instance).
+isImplicitTyCon :: TyCon -> Bool
+isImplicitTyCon tycon | isTyConAssoc tycon = True
+ | isSynTyCon tycon = False
+ | isAlgTyCon tycon = isClassTyCon tycon ||
+ isTupleTyCon tycon
+isImplicitTyCon _other = True
+ -- catches: FunTyCon, PrimTyCon,
+ -- CoTyCon, SuperKindTyCon