Take a look at the AuthenticationScheme enum you proposed: it imports RequestAuthenticatorCreator implementations. These creators in turn import implementations of RequestAuthenticator. So, the RequestAuthenticatorCreator implementations must stay in impl. So, the AuthenticationScheme Enum cannot import neither Creators nor RequestAuthenticators. If we move the AuthenticationScheme Enum to impl then we can import those clases but the ClientBuilder (which dwells in API) now cannot import the enum.