There are two different questions there: where can I use the unqualified short name, and where I have access to each of the types.
You can use the unqualified name of an internal type whenever you are within the class scope. That would be inside the class declaration, and in the definition of the methods for the given class or derived classes that do not hide the names (there are some other specifics regarding dependent names in hierarchies involving templates, but that is probably outside of the scope of the question).
The second question is where you have access to the public vs. private members of a class. You can access the private members (including types) within the same class and in any class or function that is declared to be a friend of the class after the declaration of the class. Public members can be accessed from anywhere after the compiler has seen the declaration of the class.