The only *requirement* for membership is that the necessary functions are
provided with the correct type signature. Haskell has no way to enforce
(or even specify) a "contract" such as total ordering.
Functions which operate upon members of a class may not behave correctly
if any documented contract is violated, but that would be a direct
consequence of the way that the function is written, not because the
compiler is relying upon functions conforming to a contract.
Type classes are fundamentally about the type system. They provide a
middle ground between a concrete type and an unconstrained type variable.
Without them, it would be impossible to write e.g.:
max :: (Ord a) => a -> a -> a
max x y = if x > y then x else y
If "a" was unconstrained, ">" would have to be defined for any type.
Alternatively, you'd need a separate "max" function for each type, which
in turn would require a separate ">" function for each type.