Invariants are useful for ensuring that objects behave as they're supposed. This is especially useful for the more complex objects. For example, in another lifetime, I implemented a red-black tree. This is a quite complex version of a balanced tree. Using an invariant made it much easier for me to verify that my code never veered from the constraints that make a tree red-black.
Invariants allow base classes to catch improperly written subclasses.
This is important because the assumptions that underly the base class implementation are not always obvious to subclass authors. Meyer made DBC an integral part of the Eiffel language. This allowed him to implement things like allowing postconditions access to the old values of member variables and having method overrides automatically inherit pre and postconditions. For example, XInputTargetMixin implements the Chain of Responsiblity pattern. It includes a method called HandleMenuCommand which traps exceptions and calls OnMenuCommand to give the object a chance to handle the command.