In Data.Type.Equality there are two type-level equalities defined: :~: and :~~:. They are said to represent homogenous and heterogenous equality respectively, but I don't really see any differences between them. What is it?
To be honest I don't see a way for having a real heterogenous equality in Haskell type, due to the strict border between values, types and kinds in the typesystem.