This document discusses designing abstract typeclasses to future-proof typeclass hierarchies against breaking changes. It proposes making typeclass methods hidden, similar to abstract data types, so that typeclass implementations can change without breaking client code. It presents an example using the KnownNat typeclass. It also describes using DerivingVia to write instances for abstract typeclasses by providing a public wrapper class with the same methods. This allows instances to be written while avoiding exposure to potential private changes in the abstract class.