If a type is abstract then the rest is up to the implementation of functions that operate on the data type -- and that could be hiding all <i>kinds</i> of nastiness like unsafePerformIO and the like. Yet, we usually don&#x27;t care about that because it&#x27;s an implementation detail.<p>Am I missing some way to &quot;abuse&quot; GADTs&#x2F;TFs to violate the abstraction boundary or something like that? (I seriously can&#x27;t see what you think the problem is here. I mean, you can equally well abuse unsafeCoerce&#x2F;unsafePerformIO to do all <i>kinds</i> of weird things to violate parametricity, so I don&#x27;t see why GADTs&#x2F;TFs should be singled out.)