Nested classes can be either static or non-static (inner classes). Static nested classes do not have access to outer class members, while inner classes do have access. Nested classes increase encapsulation and keep related classes grouped together logically. They can be declared as private, public, protected or package private like regular member classes. Local classes are non-static nested classes declared within a block, while anonymous classes enable instantiating a class without declaring its name. Shadowing occurs when a nested class declares a member with the same name as an outer class, requiring the use of 'this' or outer class name to disambiguate.