Nested classes allow one class to be defined within another. There are two types of nested classes - static and non-static. Static nested classes are associated with the outer class and cannot access instance variables or methods directly, while non-static nested classes can access other members of the outer class. Nested classes increase encapsulation and keep related classes together. Some compelling reasons for using nested classes are to logically group helper classes, increase encapsulation, and improve readability and maintainability of code.