Post release refactor. I moved almost everything that was package-private in com.google.inject to the internal package. The motivation is to simplify things - the previous setup was extremely awkward because c.g.i could call into internal, but not the reverse. Similarly for the SPI package.

This refactoring reduces the visibility of many symbols in internal, and makes some other code hygeine changes.

Once this is checked in, it should be much easier to add the toConstructor() binding type. That was previously difficult because the ConstructorBindingImpl class was package private and intertwined with that package.

git-svn-id: https://google-guice.googlecode.com/svn/trunk@1002 d779f126-a31b-0410-b53b-1d3aecad763e
diff --git a/extensions/jmx/jmx.iml b/extensions/jmx/jmx.iml
index a8b0fad..b1d55f1 100644
--- a/extensions/jmx/jmx.iml
+++ b/extensions/jmx/jmx.iml
@@ -8,6 +8,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="guice" />
   </component>
 </module>
 
diff --git a/extensions/jndi/jndi.iml b/extensions/jndi/jndi.iml
index c053808..271f7d6 100644
--- a/extensions/jndi/jndi.iml
+++ b/extensions/jndi/jndi.iml
@@ -7,6 +7,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="guice" />
   </component>
 </module>
 
diff --git a/src/com/google/inject/Guice.java b/src/com/google/inject/Guice.java
index 8a4c48c..df75116 100644
--- a/src/com/google/inject/Guice.java
+++ b/src/com/google/inject/Guice.java
@@ -17,6 +17,7 @@
 package com.google.inject;
 
 import java.util.Arrays;
+import com.google.inject.internal.InjectorBuilder;
 
 /**
  * The entry point to the Guice framework. Creates {@link Injector}s from
diff --git a/src/com/google/inject/Key.java b/src/com/google/inject/Key.java
index 16e62d4..9cfdb77 100644
--- a/src/com/google/inject/Key.java
+++ b/src/com/google/inject/Key.java
@@ -280,7 +280,7 @@
    * Returns a new key of the specified type with the same annotation as this
    * key.
    */
-  <T> Key<T> ofType(Class<T> type) {
+  public <T> Key<T> ofType(Class<T> type) {
     return new Key<T>(type, annotationStrategy);
   }
 
@@ -288,7 +288,7 @@
    * Returns a new key of the specified type with the same annotation as this
    * key.
    */
-  Key<?> ofType(Type type) {
+  public Key<?> ofType(Type type) {
     return new Key<Object>(type, annotationStrategy);
   }
 
@@ -303,7 +303,7 @@
   /**
    * Returns true if this key has annotation attributes.
    */
-  boolean hasAttributes() {
+  public boolean hasAttributes() {
     return annotationStrategy.hasAttributes();
   }
 
@@ -311,7 +311,7 @@
    * Returns this key without annotation attributes, i.e. with only the
    * annotation type.
    */
-  Key<T> withoutAttributes() {
+  public Key<T> withoutAttributes() {
     return new Key<T>(typeLiteral, annotationStrategy.withoutAttributes());
   }
 
diff --git a/src/com/google/inject/Scopes.java b/src/com/google/inject/Scopes.java
index a637eca..7bdaa4f 100644
--- a/src/com/google/inject/Scopes.java
+++ b/src/com/google/inject/Scopes.java
@@ -16,10 +16,7 @@
 
 package com.google.inject;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.Scoping;
-import java.lang.annotation.Annotation;
+import com.google.inject.internal.InjectorBuilder;
 
 /**
  * Built-in scope implementations.
@@ -49,7 +46,7 @@
              * Maybe one of these days we will identify independent graphs of
              * objects and offer to load them in parallel.
              */
-            synchronized (InjectorImpl.class) {
+            synchronized (InjectorBuilder.class) {
               if (instance == null) {
                 instance = creator.get();
               }
@@ -89,40 +86,4 @@
       return "Scopes.NO_SCOPE";
     }
   };
-
-  /** Scopes an internal factory. */
-  static <T> InternalFactory<? extends T> scope(Key<T> key, InjectorImpl injector,
-      InternalFactory<? extends T> creator, Scoping scoping) {
-
-    if (scoping.isNoScope()) {
-      return creator;
-    }
-
-    Scope scope = scoping.getScopeInstance();
-
-    Provider<T> scoped
-        = scope.scope(key, new ProviderToInternalFactoryAdapter<T>(injector, creator));
-    return new InternalFactoryToProviderAdapter<T>(
-        Initializables.<Provider<? extends T>>of(scoped));
-  }
-
-  /**
-   * Replaces annotation scopes with instance scopes using the Injector's annotation-to-instance
-   * map. If the scope annotation has no corresponding instance, an error will be added and unscoped
-   * will be retuned.
-   */
-  static Scoping makeInjectable(Scoping scoping, InjectorImpl injector, Errors errors) {
-    Class<? extends Annotation> scopeAnnotation = scoping.getScopeAnnotation();
-    if (scopeAnnotation == null) {
-      return scoping;
-    }
-
-    Scope scope = injector.state.getScope(scopeAnnotation);
-    if (scope != null) {
-      return Scoping.forInstance(scope);
-    }
-
-    errors.scopeNotFound(scopeAnnotation);
-    return Scoping.UNSCOPED;
-  }
 }
diff --git a/src/com/google/inject/TypeLiteral.java b/src/com/google/inject/TypeLiteral.java
index 5dfc748..8036113 100644
--- a/src/com/google/inject/TypeLiteral.java
+++ b/src/com/google/inject/TypeLiteral.java
@@ -291,7 +291,7 @@
       genericParameterTypes = method.getGenericParameterTypes();
 
     } else if (methodOrConstructor instanceof Constructor) {
-      Constructor constructor = (Constructor) methodOrConstructor;
+      Constructor<?> constructor = (Constructor<?>) methodOrConstructor;
       checkArgument(constructor.getDeclaringClass().isAssignableFrom(rawType),
           "%s does not construct a supertype of %s", constructor, type);
       genericParameterTypes = constructor.getGenericParameterTypes();
diff --git a/src/com/google/inject/AbstractProcessor.java b/src/com/google/inject/internal/AbstractProcessor.java
similarity index 95%
rename from src/com/google/inject/AbstractProcessor.java
rename to src/com/google/inject/internal/AbstractProcessor.java
index 1b447f8..05881f2 100644
--- a/src/com/google/inject/AbstractProcessor.java
+++ b/src/com/google/inject/internal/AbstractProcessor.java
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
+import com.google.inject.Binding;
 import com.google.inject.spi.Element;
 import com.google.inject.spi.ElementVisitor;
 import com.google.inject.spi.InjectionRequest;
@@ -88,7 +88,7 @@
     return false;
   }
 
-  public Boolean visit(InjectionRequest injectionRequest) {
+  public Boolean visit(InjectionRequest<?> injectionRequest) {
     return false;
   }
 
diff --git a/src/com/google/inject/internal/BindingImpl.java b/src/com/google/inject/internal/BindingImpl.java
index 471dae3..72d4ec2 100644
--- a/src/com/google/inject/internal/BindingImpl.java
+++ b/src/com/google/inject/internal/BindingImpl.java
@@ -17,7 +17,6 @@
 package com.google.inject.internal;
 
 import com.google.inject.Binding;
-import com.google.inject.Injector;
 import com.google.inject.Key;
 import com.google.inject.Provider;
 import com.google.inject.spi.BindingScopingVisitor;
@@ -29,13 +28,13 @@
  */
 public abstract class BindingImpl<T> implements Binding<T> {
 
-  private final Injector injector;
+  private final InjectorImpl injector;
   private final Key<T> key;
   private final Object source;
   private final Scoping scoping;
   private final InternalFactory<? extends T> internalFactory;
 
-  public BindingImpl(Injector injector, Key<T> key, Object source,
+  public BindingImpl(InjectorImpl injector, Key<T> key, Object source,
       InternalFactory<? extends T> internalFactory, Scoping scoping) {
     this.injector = injector;
     this.key = key;
@@ -113,7 +112,7 @@
         .toString();
   }
 
-  public Injector getInjector() {
+  public InjectorImpl getInjector() {
     return injector;
   }
 }
\ No newline at end of file
diff --git a/src/com/google/inject/BindingProcessor.java b/src/com/google/inject/internal/BindingProcessor.java
similarity index 85%
rename from src/com/google/inject/BindingProcessor.java
rename to src/com/google/inject/internal/BindingProcessor.java
index 6ceb020..acacc87 100644
--- a/src/com/google/inject/BindingProcessor.java
+++ b/src/com/google/inject/internal/BindingProcessor.java
@@ -14,23 +14,18 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Annotations;
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ExposedBindingImpl;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InstanceBindingImpl;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.LinkedBindingImpl;
-import com.google.inject.internal.LinkedProviderBindingImpl;
-import com.google.inject.internal.Lists;
-import com.google.inject.internal.ProviderInstanceBindingImpl;
-import com.google.inject.internal.ProviderMethod;
-import com.google.inject.internal.Scoping;
-import com.google.inject.internal.UntargettedBindingImpl;
+import com.google.inject.AbstractModule;
+import com.google.inject.Binder;
+import com.google.inject.Binding;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Scope;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.ConstructorBinding;
 import com.google.inject.spi.ConvertedConstantBinding;
@@ -52,7 +47,7 @@
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class BindingProcessor extends AbstractProcessor {
+final class BindingProcessor extends AbstractProcessor {
 
   private final List<CreationListener> creationListeners = Lists.newArrayList();
   private final Initializer initializer;
@@ -66,7 +61,7 @@
   @Override public <T> Boolean visit(Binding<T> command) {
     final Object source = command.getSource();
 
-    if (Void.class.equals(command.getKey().getRawType())) {
+    if (Void.class.equals(command.getKey().getTypeLiteral().getRawType())) {
       if (command instanceof ProviderInstanceBinding
           && ((ProviderInstanceBinding) command).getProviderInstance() instanceof ProviderMethod) {
         errors.voidProviderMethod();
@@ -86,7 +81,7 @@
 
     validateKey(command.getSource(), command.getKey());
 
-    final Scoping scoping = Scopes.makeInjectable(
+    final Scoping scoping = Scoping.makeInjectable(
         ((BindingImpl<?>) command).getScoping(), injector, errors);
 
     command.acceptTargetVisitor(new BindingTargetVisitor<T, Void>() {
@@ -97,7 +92,7 @@
         Initializable<T> ref = initializer.requestInjection(
             injector, instance, source, injectionPoints);
         ConstantFactory<? extends T> factory = new ConstantFactory<T>(ref);
-        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
+        InternalFactory<? extends T> scopedFactory = Scoping.scope(key, injector, factory, scoping);
         putBinding(new InstanceBindingImpl<T>(injector, key, source, scopedFactory, injectionPoints,
             instance));
         return null;
@@ -109,7 +104,7 @@
         Initializable<Provider<? extends T>> initializable = initializer
             .<Provider<? extends T>>requestInjection(injector, provider, source, injectionPoints);
         InternalFactory<T> factory = new InternalFactoryToProviderAdapter<T>(initializable, source);
-        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
+        InternalFactory<? extends T> scopedFactory = Scoping.scope(key, injector, factory, scoping);
         putBinding(new ProviderInstanceBindingImpl<T>(injector, key, source, scopedFactory, scoping,
             provider, injectionPoints));
         return null;
@@ -120,7 +115,7 @@
         BoundProviderFactory<T> boundProviderFactory
             = new BoundProviderFactory<T>(injector, providerKey, source);
         creationListeners.add(boundProviderFactory);
-        InternalFactory<? extends T> scopedFactory = Scopes.scope(
+        InternalFactory<? extends T> scopedFactory = Scoping.scope(
             key, injector, (InternalFactory<? extends T>) boundProviderFactory, scoping);
         putBinding(new LinkedProviderBindingImpl<T>(
             injector, key, source, scopedFactory, scoping, providerKey));
@@ -135,7 +130,7 @@
 
         FactoryProxy<T> factory = new FactoryProxy<T>(injector, key, linkedKey, source);
         creationListeners.add(factory);
-        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
+        InternalFactory<? extends T> scopedFactory = Scoping.scope(key, injector, factory, scoping);
         putBinding(
             new LinkedBindingImpl<T>(injector, key, source, scopedFactory, scoping, linkedKey));
         return null;
@@ -146,7 +141,7 @@
         // Example: bind(Date.class).annotatedWith(Red.class);
         // We can't assume abstract types aren't injectable. They may have an
         // @ImplementedBy annotation or something.
-        if (key.hasAnnotationType()) {
+        if (key.getAnnotationType() != null) {
           errors.missingImplementation(key);
           putBinding(invalidBinding(injector, key, source));
           return null;
@@ -166,8 +161,7 @@
         uninitializedBindings.add(new Runnable() {
           public void run() {
             try {
-              ((InjectorImpl) binding.getInjector()).initializeBinding(
-                  binding, errors.withSource(source));
+              binding.getInjector().initializeBinding(binding, errors.withSource(source));
             } catch (ErrorsException e) {
               errors.merge(e.getErrors());
             }
@@ -212,7 +206,8 @@
   }
 
   private <T> void validateKey(Object source, Key<T> key) {
-    Annotations.checkForMisplacedScopeAnnotations(key.getRawType(), source, errors);
+    Annotations.checkForMisplacedScopeAnnotations(
+        key.getTypeLiteral().getRawType(), source, errors);
   }
 
   <T> UntargettedBindingImpl<T> invalidBinding(InjectorImpl injector, Key<T> key, Object source) {
@@ -234,7 +229,7 @@
   private void putBinding(BindingImpl<?> binding) {
     Key<?> key = binding.getKey();
 
-    Class<?> rawType = key.getRawType();
+    Class<?> rawType = key.getTypeLiteral().getRawType();
     if (FORBIDDEN_TYPES.contains(rawType)) {
       errors.cannotBindToGuiceType(rawType.getSimpleName());
       return;
diff --git a/src/com/google/inject/BoundProviderFactory.java b/src/com/google/inject/internal/BoundProviderFactory.java
similarity index 83%
rename from src/com/google/inject/BoundProviderFactory.java
rename to src/com/google/inject/internal/BoundProviderFactory.java
index 6528a9b..1e68b74 100644
--- a/src/com/google/inject/BoundProviderFactory.java
+++ b/src/com/google/inject/internal/BoundProviderFactory.java
@@ -14,19 +14,17 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.BindingProcessor.CreationListener;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.internal.BindingProcessor.CreationListener;
 import com.google.inject.spi.Dependency;
 
 /**
  * Delegates to a custom factory which is also bound in the injector.
  */
-class BoundProviderFactory<T> implements InternalFactory<T>, CreationListener {
+final class BoundProviderFactory<T> implements InternalFactory<T>, CreationListener {
 
   private final InjectorImpl injector;
   final Key<? extends Provider<? extends T>> providerKey;
diff --git a/src/com/google/inject/internal/BytecodeGen.java b/src/com/google/inject/internal/BytecodeGen.java
index 1c31f8b..da008d4 100644
--- a/src/com/google/inject/internal/BytecodeGen.java
+++ b/src/com/google/inject/internal/BytecodeGen.java
@@ -55,7 +55,7 @@
  * @author mcculls@gmail.com (Stuart McCulloch)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-public final class BytecodeGen {
+final class BytecodeGen {
 
   private static final Logger logger = Logger.getLogger(BytecodeGen.class.getName());
 
diff --git a/src/com/google/inject/internal/Classes.java b/src/com/google/inject/internal/Classes.java
index c023a78..8c587ca 100644
--- a/src/com/google/inject/internal/Classes.java
+++ b/src/com/google/inject/internal/Classes.java
@@ -21,7 +21,7 @@
 /**
  * Class utilities.
  */
-public class Classes {
+final class Classes {
 
   public static boolean isInnerClass(Class<?> clazz) {
     return !Modifier.isStatic(clazz.getModifiers())
diff --git a/src/com/google/inject/ConstantFactory.java b/src/com/google/inject/internal/ConstantFactory.java
similarity index 77%
rename from src/com/google/inject/ConstantFactory.java
rename to src/com/google/inject/internal/ConstantFactory.java
index 291a10d..9c6bb5d 100644
--- a/src/com/google/inject/ConstantFactory.java
+++ b/src/com/google/inject/internal/ConstantFactory.java
@@ -14,19 +14,14 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.ToStringBuilder;
 import com.google.inject.spi.Dependency;
 
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-class ConstantFactory<T> implements InternalFactory<T> {
+final class ConstantFactory<T> implements InternalFactory<T> {
 
   private final Initializable<T> initializable;
 
diff --git a/src/com/google/inject/internal/ConstructionContext.java b/src/com/google/inject/internal/ConstructionContext.java
index 6764fb4..b5fd538 100644
--- a/src/com/google/inject/internal/ConstructionContext.java
+++ b/src/com/google/inject/internal/ConstructionContext.java
@@ -28,7 +28,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public class ConstructionContext<T> {
+final class ConstructionContext<T> {
 
   T currentReference;
   boolean constructing;
diff --git a/src/com/google/inject/ConstructionProxy.java b/src/com/google/inject/internal/ConstructionProxy.java
similarity index 95%
rename from src/com/google/inject/ConstructionProxy.java
rename to src/com/google/inject/internal/ConstructionProxy.java
index 71d620f..fe3eb22 100644
--- a/src/com/google/inject/ConstructionProxy.java
+++ b/src/com/google/inject/internal/ConstructionProxy.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.ImmutableMap;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
diff --git a/src/com/google/inject/ConstructionProxyFactory.java b/src/com/google/inject/internal/ConstructionProxyFactory.java
similarity index 95%
rename from src/com/google/inject/ConstructionProxyFactory.java
rename to src/com/google/inject/internal/ConstructionProxyFactory.java
index de9c47e..9d7caa4 100644
--- a/src/com/google/inject/ConstructionProxyFactory.java
+++ b/src/com/google/inject/internal/ConstructionProxyFactory.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
 /**
  * Creates {@link ConstructionProxy} instances.
diff --git a/src/com/google/inject/ConstructorBindingImpl.java b/src/com/google/inject/internal/ConstructorBindingImpl.java
similarity index 83%
rename from src/com/google/inject/ConstructorBindingImpl.java
rename to src/com/google/inject/internal/ConstructorBindingImpl.java
index fa6954e..0438808 100644
--- a/src/com/google/inject/ConstructorBindingImpl.java
+++ b/src/com/google/inject/internal/ConstructorBindingImpl.java
@@ -14,17 +14,11 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
+import com.google.inject.Binder;
+import com.google.inject.Key;
 import static com.google.inject.internal.Preconditions.checkState;
-import com.google.inject.internal.Scoping;
-import com.google.inject.internal.ToStringBuilder;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.ConstructorBinding;
 import com.google.inject.spi.Dependency;
@@ -34,11 +28,11 @@
 import java.util.Map;
 import java.util.Set;
 
-class ConstructorBindingImpl<T> extends BindingImpl<T> implements ConstructorBinding<T> {
+final class ConstructorBindingImpl<T> extends BindingImpl<T> implements ConstructorBinding<T> {
 
   private final Factory<T> factory;
 
-  private ConstructorBindingImpl(Injector injector, Key<T> key, Object source,
+  private ConstructorBindingImpl(InjectorImpl injector, Key<T> key, Object source,
       InternalFactory<? extends T> scopedFactory, Scoping scoping, Factory<T> factory) {
     super(injector, key, source, scopedFactory, scoping);
     this.factory = factory;
@@ -48,7 +42,7 @@
       InjectorImpl injector, Key<T> key, Object source, Scoping scoping) {
     Factory<T> factoryFactory = new Factory<T>();
     InternalFactory<? extends T> scopedFactory
-        = Scopes.scope(key, injector, factoryFactory, scoping);
+        = Scoping.scope(key, injector, factoryFactory, scoping);
     return new ConstructorBindingImpl<T>(
         injector, key, source, scopedFactory, scoping, factoryFactory);
   }
@@ -108,7 +102,8 @@
 
       // This may not actually be safe because it could return a super type of T (if that's all the
       // client needs), but it should be OK in practice thanks to the wonders of erasure.
-      return (T) constructorInjector.construct(errors, context, dependency.getKey().getRawType());
+      return (T) constructorInjector.construct(errors, context,
+          dependency.getKey().getTypeLiteral().getRawType());
     }
   }
 }
diff --git a/src/com/google/inject/ConstructorInjector.java b/src/com/google/inject/internal/ConstructorInjector.java
similarity index 91%
rename from src/com/google/inject/ConstructorInjector.java
rename to src/com/google/inject/internal/ConstructorInjector.java
index f1d0a79..390481f 100644
--- a/src/com/google/inject/ConstructorInjector.java
+++ b/src/com/google/inject/internal/ConstructorInjector.java
@@ -14,13 +14,8 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.ConstructionContext;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InternalContext;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.InvocationTargetException;
 
@@ -30,7 +25,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class ConstructorInjector<T> {
+final class ConstructorInjector<T> {
 
   private final ImmutableSet<InjectionPoint> injectableMembers;
   private final SingleParameterInjector<?>[] parameterInjectors;
diff --git a/src/com/google/inject/ConstructorInjectorStore.java b/src/com/google/inject/internal/ConstructorInjectorStore.java
similarity index 92%
rename from src/com/google/inject/ConstructorInjectorStore.java
rename to src/com/google/inject/internal/ConstructorInjectorStore.java
index 069318f..af0b07d 100644
--- a/src/com/google/inject/ConstructorInjectorStore.java
+++ b/src/com/google/inject/internal/ConstructorInjectorStore.java
@@ -14,12 +14,10 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.FailableCache;
-import com.google.inject.internal.ImmutableList;
+import com.google.inject.ConfigurationException;
+import com.google.inject.TypeLiteral;
 import static com.google.inject.internal.Iterables.concat;
 import com.google.inject.spi.InjectionPoint;
 
@@ -28,7 +26,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class ConstructorInjectorStore {
+final class ConstructorInjectorStore {
   private final InjectorImpl injector;
 
   private final FailableCache<TypeLiteral<?>, ConstructorInjector<?>>  cache
diff --git a/src/com/google/inject/ContextualCallable.java b/src/com/google/inject/internal/ContextualCallable.java
similarity index 84%
rename from src/com/google/inject/ContextualCallable.java
rename to src/com/google/inject/internal/ContextualCallable.java
index e4f6c5f..80d0d43 100644
--- a/src/com/google/inject/ContextualCallable.java
+++ b/src/com/google/inject/internal/ContextualCallable.java
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
-
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
+package com.google.inject.internal;
 
 /**
  * @author crazybob@google.com (Bob Lee)
diff --git a/src/com/google/inject/DefaultConstructionProxyFactory.java b/src/com/google/inject/internal/DefaultConstructionProxyFactory.java
similarity index 94%
rename from src/com/google/inject/DefaultConstructionProxyFactory.java
rename to src/com/google/inject/internal/DefaultConstructionProxyFactory.java
index bce8098..6bcaeef 100644
--- a/src/com/google/inject/DefaultConstructionProxyFactory.java
+++ b/src/com/google/inject/internal/DefaultConstructionProxyFactory.java
@@ -14,11 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BytecodeGen;
 import com.google.inject.internal.BytecodeGen.Visibility;
-import com.google.inject.internal.ImmutableMap;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -31,7 +29,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class DefaultConstructionProxyFactory<T> implements ConstructionProxyFactory<T> {
+final class DefaultConstructionProxyFactory<T> implements ConstructionProxyFactory<T> {
 
   private final InjectionPoint injectionPoint;
 
diff --git a/src/com/google/inject/DeferredLookups.java b/src/com/google/inject/internal/DeferredLookups.java
similarity index 84%
rename from src/com/google/inject/DeferredLookups.java
rename to src/com/google/inject/internal/DeferredLookups.java
index 2c14a26..ee54507 100644
--- a/src/com/google/inject/DeferredLookups.java
+++ b/src/com/google/inject/internal/DeferredLookups.java
@@ -14,10 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.Lists;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.Element;
 import com.google.inject.spi.MembersInjectorLookup;
 import com.google.inject.spi.ProviderLookup;
@@ -29,18 +31,18 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class DeferredLookups implements Lookups {
+final class DeferredLookups implements Lookups {
   private final InjectorImpl injector;
   private final List<Element> lookups = Lists.newArrayList();
 
-  public DeferredLookups(InjectorImpl injector) {
+  DeferredLookups(InjectorImpl injector) {
     this.injector = injector;
   }
 
   /**
    * Initialize the specified lookups, either immediately or when the injector is created.
    */
-  public void initialize(Errors errors) {
+  void initialize(Errors errors) {
     injector.lookups = injector;
     new LookupProcessor(errors).process(injector, lookups);
   }
diff --git a/src/com/google/inject/EncounterImpl.java b/src/com/google/inject/internal/EncounterImpl.java
similarity index 89%
rename from src/com/google/inject/EncounterImpl.java
rename to src/com/google/inject/internal/EncounterImpl.java
index 3963009..8fce696 100644
--- a/src/com/google/inject/EncounterImpl.java
+++ b/src/com/google/inject/internal/EncounterImpl.java
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.Lists;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
 import static com.google.inject.internal.Preconditions.checkState;
 import com.google.inject.matcher.Matcher;
 import com.google.inject.matcher.Matchers;
@@ -42,17 +43,17 @@
   /*end[AOP]*/
   private boolean valid = true;
 
-  public EncounterImpl(Errors errors, Lookups lookups) {
+  EncounterImpl(Errors errors, Lookups lookups) {
     this.errors = errors;
     this.lookups = lookups;
   }
 
-  public void invalidate() {
+  void invalidate() {
     valid = false;
   }
 
   /*if[AOP]*/
-  public ImmutableList<MethodAspect> getAspects() {
+  ImmutableList<MethodAspect> getAspects() {
     return aspects == null
         ? ImmutableList.<MethodAspect>of()
         : ImmutableList.copyOf(aspects);
@@ -71,13 +72,13 @@
   }
   /*end[AOP]*/
 
-  public ImmutableList<MembersInjector<? super T>> getMembersInjectors() {
+  ImmutableList<MembersInjector<? super T>> getMembersInjectors() {
     return membersInjectors == null
         ? ImmutableList.<MembersInjector<? super T>>of()
         : ImmutableList.copyOf(membersInjectors);
   }
 
-  public ImmutableList<InjectionListener<? super T>> getInjectionListeners() {
+  ImmutableList<InjectionListener<? super T>> getInjectionListeners() {
     return injectionListeners == null
         ? ImmutableList.<InjectionListener<? super T>>of()
         : ImmutableList.copyOf(injectionListeners);
diff --git a/src/com/google/inject/internal/ErrorHandler.java b/src/com/google/inject/internal/ErrorHandler.java
index 7b3fa70..b448eb7 100644
--- a/src/com/google/inject/internal/ErrorHandler.java
+++ b/src/com/google/inject/internal/ErrorHandler.java
@@ -23,7 +23,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public interface ErrorHandler {
+interface ErrorHandler {
 
   /**
    * Handles an error.
diff --git a/src/com/google/inject/internal/ExposedBindingImpl.java b/src/com/google/inject/internal/ExposedBindingImpl.java
index 9e59a5c..dfaf7bf 100644
--- a/src/com/google/inject/internal/ExposedBindingImpl.java
+++ b/src/com/google/inject/internal/ExposedBindingImpl.java
@@ -25,11 +25,11 @@
 import com.google.inject.spi.PrivateElements;
 import java.util.Set;
 
-public class ExposedBindingImpl<T> extends BindingImpl<T> implements ExposedBinding<T> {
+public final class ExposedBindingImpl<T> extends BindingImpl<T> implements ExposedBinding<T> {
 
   private final PrivateElements privateElements;
 
-  public ExposedBindingImpl(Injector injector, Object source, Key<T> key,
+  public ExposedBindingImpl(InjectorImpl injector, Object source, Key<T> key,
       InternalFactory<T> factory, PrivateElements privateElements) {
     super(injector, key, source, factory, Scoping.UNSCOPED);
     this.privateElements = privateElements;
diff --git a/src/com/google/inject/ExposedKeyFactory.java b/src/com/google/inject/internal/ExposedKeyFactory.java
similarity index 80%
rename from src/com/google/inject/ExposedKeyFactory.java
rename to src/com/google/inject/internal/ExposedKeyFactory.java
index c08786c..b771caa 100644
--- a/src/com/google/inject/ExposedKeyFactory.java
+++ b/src/com/google/inject/internal/ExposedKeyFactory.java
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
+import com.google.inject.Key;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.PrivateElements;
 
@@ -28,12 +24,12 @@
  * This factory exists in a parent injector. When invoked, it retrieves its value from a child
  * injector.
  */
-class ExposedKeyFactory<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
+final class ExposedKeyFactory<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
   private final Key<T> key;
   private final PrivateElements privateElements;
   private BindingImpl<T> delegate;
 
-  public ExposedKeyFactory(Key<T> key, PrivateElements privateElements) {
+  ExposedKeyFactory(Key<T> key, PrivateElements privateElements) {
     this.key = key;
     this.privateElements = privateElements;
   }
diff --git a/src/com/google/inject/FactoryProxy.java b/src/com/google/inject/internal/FactoryProxy.java
similarity index 82%
rename from src/com/google/inject/FactoryProxy.java
rename to src/com/google/inject/internal/FactoryProxy.java
index d56d7ef..f7ed880 100644
--- a/src/com/google/inject/FactoryProxy.java
+++ b/src/com/google/inject/internal/FactoryProxy.java
@@ -14,20 +14,15 @@
  * limitations under the License.
  */
 
+package com.google.inject.internal;
 
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.ToStringBuilder;
+import com.google.inject.Key;
 import com.google.inject.spi.Dependency;
 
 /**
  * A placeholder which enables us to swap in the real factory once the injector is created.
  */
-class FactoryProxy<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
+final class FactoryProxy<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
 
   private final InjectorImpl injector;
   private final Key<T> key;
diff --git a/src/com/google/inject/InheritingState.java b/src/com/google/inject/internal/InheritingState.java
similarity index 92%
rename from src/com/google/inject/InheritingState.java
rename to src/com/google/inject/internal/InheritingState.java
index 51c81c9..0602132 100644
--- a/src/com/google/inject/InheritingState.java
+++ b/src/com/google/inject/internal/InheritingState.java
@@ -14,14 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.Lists;
-import com.google.inject.internal.Maps;
-import com.google.inject.internal.MatcherAndConverter;
+import com.google.inject.Binding;
+import com.google.inject.Key;
+import com.google.inject.Scope;
+import com.google.inject.TypeLiteral;
 import static com.google.inject.internal.Preconditions.checkNotNull;
 import com.google.inject.spi.TypeListenerBinding;
 import java.lang.annotation.Annotation;
@@ -33,7 +31,7 @@
 /**
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class InheritingState implements State {
+final class InheritingState implements State {
 
   private final State parent;
 
diff --git a/src/com/google/inject/Initializable.java b/src/com/google/inject/internal/Initializable.java
similarity index 87%
rename from src/com/google/inject/Initializable.java
rename to src/com/google/inject/internal/Initializable.java
index a418722..855dd8c 100644
--- a/src/com/google/inject/Initializable.java
+++ b/src/com/google/inject/internal/Initializable.java
@@ -14,10 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
+package com.google.inject.internal;
 
 /**
  * Holds a reference that requires initialization to be performed before it can be used.
diff --git a/src/com/google/inject/Initializables.java b/src/com/google/inject/internal/Initializables.java
similarity index 87%
rename from src/com/google/inject/Initializables.java
rename to src/com/google/inject/internal/Initializables.java
index a041c74..82e2868 100644
--- a/src/com/google/inject/Initializables.java
+++ b/src/com/google/inject/internal/Initializables.java
@@ -14,15 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
+package com.google.inject.internal;
 
 /**
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class Initializables {
+final class Initializables {
 
   /**
    * Returns an initializable for an instance that requires no initialization.
diff --git a/src/com/google/inject/Initializer.java b/src/com/google/inject/internal/Initializer.java
similarity index 92%
rename from src/com/google/inject/Initializer.java
rename to src/com/google/inject/internal/Initializer.java
index ab396e4..68206f5 100644
--- a/src/com/google/inject/Initializer.java
+++ b/src/com/google/inject/internal/Initializer.java
@@ -14,12 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.Lists;
-import com.google.inject.internal.Maps;
+import com.google.inject.TypeLiteral;
 import static com.google.inject.internal.Preconditions.checkNotNull;
 import com.google.inject.spi.InjectionPoint;
 import java.util.Map;
@@ -33,7 +30,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class Initializer {
+final class Initializer {
   /** the only thread that we'll use to inject members. */
   private final Thread creatingThread = Thread.currentThread();
 
@@ -50,7 +47,7 @@
    *      @Inject).
    * @param source the source location that this injection was requested
    */
-  public <T> Initializable<T> requestInjection(InjectorImpl injector, T instance, Object source,
+  <T> Initializable<T> requestInjection(InjectorImpl injector, T instance, Object source,
       Set<InjectionPoint> injectionPoints) {
     checkNotNull(source);
 
@@ -116,7 +113,7 @@
 
     public void validate(Errors errors) throws ErrorsException {
       @SuppressWarnings("unchecked") // the type of 'T' is a TypeLiteral<T>
-      TypeLiteral<T> type = TypeLiteral.get((Class<T>) instance.getClass());
+          TypeLiteral<T> type = TypeLiteral.get((Class<T>) instance.getClass());
       membersInjector = injector.membersInjectorStore.get(type, errors.withSource(source));
     }
 
diff --git a/src/com/google/inject/InjectionRequestProcessor.java b/src/com/google/inject/internal/InjectionRequestProcessor.java
similarity index 86%
rename from src/com/google/inject/InjectionRequestProcessor.java
rename to src/com/google/inject/internal/InjectionRequestProcessor.java
index 67af134..aa98fbc 100644
--- a/src/com/google/inject/InjectionRequestProcessor.java
+++ b/src/com/google/inject/internal/InjectionRequestProcessor.java
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.Lists;
+import com.google.inject.ConfigurationException;
 import com.google.inject.spi.InjectionPoint;
 import com.google.inject.spi.InjectionRequest;
 import com.google.inject.spi.StaticInjectionRequest;
@@ -28,13 +24,13 @@
 import java.util.Set;
 
 /**
- * Handles {@link Binder#requestInjection} and {@link Binder#requestStaticInjection} commands.
+ * Handles {@code Binder.requestInjection} and {@code Binder.requestStaticInjection} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  * @author mikeward@google.com (Mike Ward)
  */
-class InjectionRequestProcessor extends AbstractProcessor {
+final class InjectionRequestProcessor extends AbstractProcessor {
 
   private final List<StaticInjection> staticInjections = Lists.newArrayList();
   private final Initializer initializer;
@@ -49,7 +45,7 @@
     return true;
   }
 
-  @Override public Boolean visit(InjectionRequest request) {
+  @Override public Boolean visit(InjectionRequest<?> request) {
     Set<InjectionPoint> injectionPoints;
     try {
       injectionPoints = request.getInjectionPoints();
@@ -63,13 +59,13 @@
     return true;
   }
 
-  public void validate() {
+  void validate() {
     for (StaticInjection staticInjection : staticInjections) {
       staticInjection.validate();
     }
   }
 
-  public void injectMembers() {
+  void injectMembers() {
     for (StaticInjection staticInjection : staticInjections) {
       staticInjection.injectMembers();
     }
diff --git a/src/com/google/inject/InjectorBuilder.java b/src/com/google/inject/internal/InjectorBuilder.java
similarity index 92%
rename from src/com/google/inject/InjectorBuilder.java
rename to src/com/google/inject/internal/InjectorBuilder.java
index 35720d2..cea61dc 100644
--- a/src/com/google/inject/InjectorBuilder.java
+++ b/src/com/google/inject/internal/InjectorBuilder.java
@@ -14,16 +14,16 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.Iterables;
-import com.google.inject.internal.LinkedBindingImpl;
-import com.google.inject.internal.Stopwatch;
+import com.google.inject.Binding;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import com.google.inject.Stage;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.Dependency;
 import java.util.Collection;
 import java.util.List;
@@ -32,7 +32,7 @@
 
 /**
  * Builds a tree of injectors. This is a primary injector, plus child injectors needed for each
- * {@link Binder#newPrivateBinder() private environment}. The primary injector is not necessarily a
+ * {@code Binder.newPrivateBinder() private environment}. The primary injector is not necessarily a
  * top-level injector.
  *
  * <p>Injector construction happens in two phases.
@@ -49,7 +49,7 @@
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class InjectorBuilder {
+public final class InjectorBuilder {
 
   private final Stopwatch stopwatch = new Stopwatch();
   private final Errors errors = new Errors();
@@ -63,7 +63,7 @@
   private final InjectorShell.Builder shellBuilder = new InjectorShell.Builder();
   private List<InjectorShell> shells;
 
-  InjectorBuilder() {
+  public InjectorBuilder() {
     injectionRequestProcessor = new InjectionRequestProcessor(errors, initializer);
     bindingProcesor = new BindingProcessor(errors, initializer);
   }
@@ -72,7 +72,7 @@
    * Sets the stage for the created injector. If the stage is {@link Stage#PRODUCTION}, this class
    * will eagerly load singletons.
    */
-  InjectorBuilder stage(Stage stage) {
+  public InjectorBuilder stage(Stage stage) {
     shellBuilder.stage(stage);
     this.stage = stage;
     return this;
@@ -82,17 +82,17 @@
    * Sets the parent of the injector to-be-constructed. As a side effect, this sets this injector's
    * stage to the stage of {@code parent}.
    */
-  InjectorBuilder parentInjector(InjectorImpl parent) {
+  public InjectorBuilder parentInjector(InjectorImpl parent) {
     shellBuilder.parent(parent);
     return stage(parent.getInstance(Stage.class));
   }
 
-  InjectorBuilder addModules(Iterable<? extends Module> modules) {
+  public InjectorBuilder addModules(Iterable<? extends Module> modules) {
     shellBuilder.addModules(modules);
     return this;
   }
 
-  Injector build() {
+  public Injector build() {
     if (shellBuilder == null) {
       throw new AssertionError("Already built, builders are not reusable.");
     }
@@ -184,7 +184,7 @@
    * Loads eager singletons, or all singletons if we're in Stage.PRODUCTION. Bindings discovered
    * while we're binding these singletons are not be eager.
    */
-  public void loadEagerSingletons(InjectorImpl injector, Stage stage, final Errors errors) {
+  void loadEagerSingletons(InjectorImpl injector, Stage stage, final Errors errors) {
     @SuppressWarnings("unchecked") // casting Collection<Binding> to Collection<BindingImpl> is safe
     Set<BindingImpl<?>> candidateBindings = ImmutableSet.copyOf(Iterables.concat(
         (Collection) injector.state.getExplicitBindingsThisLevel().values(),
diff --git a/src/com/google/inject/InjectorImpl.java b/src/com/google/inject/internal/InjectorImpl.java
similarity index 93%
rename from src/com/google/inject/InjectorImpl.java
rename to src/com/google/inject/internal/InjectorImpl.java
index a26b28c..bcd653b 100644
--- a/src/com/google/inject/InjectorImpl.java
+++ b/src/com/google/inject/internal/InjectorImpl.java
@@ -14,28 +14,21 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Annotations;
+import com.google.inject.Binder;
+import com.google.inject.Binding;
+import com.google.inject.ConfigurationException;
+import com.google.inject.ImplementedBy;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.Module;
+import com.google.inject.ProvidedBy;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
+import com.google.inject.TypeLiteral;
 import static com.google.inject.internal.Annotations.findScopeAnnotation;
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Classes;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InstanceBindingImpl;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.LinkedBindingImpl;
-import com.google.inject.internal.LinkedProviderBindingImpl;
-import com.google.inject.internal.Lists;
-import com.google.inject.internal.Maps;
-import com.google.inject.internal.MatcherAndConverter;
-import com.google.inject.internal.Nullable;
-import com.google.inject.internal.Scoping;
-import com.google.inject.internal.SourceProvider;
-import com.google.inject.internal.ToStringBuilder;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.ConvertedConstantBinding;
 import com.google.inject.spi.Dependency;
@@ -60,7 +53,7 @@
  * @author crazybob@google.com (Bob Lee)
  * @see InjectorBuilder
  */
-class InjectorImpl implements Injector, Lookups {
+final class InjectorImpl implements Injector, Lookups {
   final State state;
   final InjectorImpl parent;
   final BindingsMultimap bindingsMultimap = new BindingsMultimap();
@@ -120,7 +113,7 @@
    * checks for an explicit binding. If no explicit binding is found, it looks for a just-in-time
    * binding.
    */
-  public <T> BindingImpl<T> getBindingOrThrow(Key<T> key, Errors errors)
+  <T> BindingImpl<T> getBindingOrThrow(Key<T> key, Errors errors)
       throws ErrorsException {
     // Check explicit bindings, i.e. bindings created by modules.
     BindingImpl<T> binding = state.getExplicitBinding(key);
@@ -174,14 +167,14 @@
   }
 
   /** Returns true if the key type is Provider (but not a subclass of Provider). */
-  static boolean isProvider(Key<?> key) {
+  private static boolean isProvider(Key<?> key) {
     return key.getTypeLiteral().getRawType().equals(Provider.class);
   }
 
   /** Returns true if the key type is MembersInjector (but not a subclass of MembersInjector). */
-  static boolean isMembersInjector(Key<?> key) {
+  private static boolean isMembersInjector(Key<?> key) {
     return key.getTypeLiteral().getRawType().equals(MembersInjector.class)
-        && !key.hasAnnotationType();
+        && !(key.getAnnotationType() != null);
   }
 
   private <T> BindingImpl<MembersInjector<T>> createMembersInjectorBinding(
@@ -226,7 +219,7 @@
     return new ProviderBindingImpl<T>(this, key, delegate);
   }
 
-  static class ProviderBindingImpl<T> extends BindingImpl<Provider<T>>
+  private static class ProviderBindingImpl<T> extends BindingImpl<Provider<T>>
       implements ProviderBinding<Provider<T>> {
     final BindingImpl<T> providedBinding;
 
@@ -323,7 +316,7 @@
     final Binding<String> originalBinding;
 
     ConvertedConstantBindingImpl(
-        Injector injector, Key<T> key, T value, Binding<String> originalBinding) {
+        InjectorImpl injector, Key<T> key, T value, Binding<String> originalBinding) {
       super(injector, key, originalBinding.getSource(),
           new ConstantFactory<T>(Initializables.of(value)), Scoping.UNSCOPED);
       this.value = value;
@@ -434,7 +427,7 @@
     if (!scoping.isExplicitlyScoped()) {
       Class<? extends Annotation> scopeAnnotation = findScopeAnnotation(errors, rawType);
       if (scopeAnnotation != null) {
-        scoping = Scopes.makeInjectable(Scoping.forAnnotation(scopeAnnotation),
+        scoping = Scoping.makeInjectable(Scoping.forAnnotation(scopeAnnotation),
             this, errors.withSource(rawType));
       }
     }
@@ -514,13 +507,13 @@
         this,
         key,
         rawType /* source */,
-        Scopes.<T>scope(key, this, internalFactory, scoping),
+        Scoping.<T>scope(key, this, internalFactory, scoping),
         scoping,
         providerKey);
   }
 
   /** Creates a binding for a type annotated with @ImplementedBy. */
-  <T> BindingImpl<T> createImplementedByBinding(Key<T> key, Scoping scoping,
+  private <T> BindingImpl<T> createImplementedByBinding(Key<T> key, Scoping scoping,
       ImplementedBy implementedBy, Errors errors)
       throws ErrorsException {
     Class<?> rawType = key.getTypeLiteral().getRawType();
@@ -555,7 +548,7 @@
         this,
         key,
         rawType /* source */,
-        Scopes.<T>scope(key, this, internalFactory, scoping),
+        Scoping.<T>scope(key, this, internalFactory, scoping),
         scoping,
         targetKey);
   }
@@ -597,7 +590,8 @@
    *
    * @throws com.google.inject.internal.ErrorsException if the binding cannot be created.
    */
-  <T> BindingImpl<T> createJustInTimeBinding(Key<T> key, Errors errors) throws ErrorsException {
+  private <T> BindingImpl<T> createJustInTimeBinding(Key<T> key, Errors errors)
+      throws ErrorsException {
     int numErrorsBefore = errors.size();
 
     if (state.isBlacklisted(key)) {
@@ -609,7 +603,7 @@
       // These casts are safe. We know T extends Provider<X> and that given Key<Provider<X>>,
       // createProviderBinding() will return BindingImpl<Provider<X>>.
       @SuppressWarnings("unchecked")
-      BindingImpl binding = createProviderBinding((Key) key, errors);
+      BindingImpl<T> binding = (BindingImpl<T>) createProviderBinding((Key) key, errors);
       return binding;
     }
 
@@ -618,7 +612,7 @@
       // These casts are safe. T extends MembersInjector<X> and that given Key<MembersInjector<X>>,
       // createMembersInjectorBinding() will return BindingImpl<MembersInjector<X>>.
       @SuppressWarnings("unchecked")
-      BindingImpl binding = createMembersInjectorBinding((Key) key, errors);
+      BindingImpl<T> binding = (BindingImpl<T>) createMembersInjectorBinding((Key) key, errors);
       return binding;
     }
 
@@ -629,7 +623,7 @@
     }
 
     // If the key has an annotation...
-    if (key.hasAnnotationType()) {
+    if (key.getAnnotationType() != null) {
       // Look for a binding without annotation attributes or return null.
       if (key.hasAttributes()) {
         try {
diff --git a/src/com/google/inject/InjectorShell.java b/src/com/google/inject/internal/InjectorShell.java
similarity index 92%
rename from src/com/google/inject/InjectorShell.java
rename to src/com/google/inject/internal/InjectorShell.java
index ce9e5b9..afd9154 100644
--- a/src/com/google/inject/InjectorShell.java
+++ b/src/com/google/inject/internal/InjectorShell.java
@@ -14,22 +14,18 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
+import com.google.inject.Binder;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provider;
 import static com.google.inject.Scopes.SINGLETON;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
-import com.google.inject.internal.Lists;
+import com.google.inject.Singleton;
+import com.google.inject.Stage;
 import static com.google.inject.internal.Preconditions.checkNotNull;
 import static com.google.inject.internal.Preconditions.checkState;
-import com.google.inject.internal.PrivateElementsImpl;
-import com.google.inject.internal.ProviderInstanceBindingImpl;
-import com.google.inject.internal.Scoping;
-import com.google.inject.internal.SourceProvider;
-import com.google.inject.internal.Stopwatch;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.Element;
 import com.google.inject.spi.Elements;
@@ -45,7 +41,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class InjectorShell {
+final class InjectorShell {
 
   private final List<Element> elements;
   private final InjectorImpl injector;
@@ -57,7 +53,7 @@
     this.injector = injector;
   }
 
-  PrivateElements getPrivateElements() {
+  private PrivateElements getPrivateElements() {
     return privateElements;
   }
 
diff --git a/src/com/google/inject/internal/InstanceBindingImpl.java b/src/com/google/inject/internal/InstanceBindingImpl.java
index efa3f12..8289a39 100644
--- a/src/com/google/inject/internal/InstanceBindingImpl.java
+++ b/src/com/google/inject/internal/InstanceBindingImpl.java
@@ -16,10 +16,9 @@
 
 package com.google.inject.internal;
 
-import com.google.inject.Injector;
+import com.google.inject.Binder;
 import com.google.inject.Key;
 import com.google.inject.Provider;
-import com.google.inject.Binder;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.HasDependencies;
@@ -28,13 +27,13 @@
 import com.google.inject.util.Providers;
 import java.util.Set;
 
-public class InstanceBindingImpl<T> extends BindingImpl<T> implements InstanceBinding<T> {
+final class InstanceBindingImpl<T> extends BindingImpl<T> implements InstanceBinding<T> {
 
   final T instance;
   final Provider<T> provider;
   final ImmutableSet<InjectionPoint> injectionPoints;
 
-  public InstanceBindingImpl(Injector injector, Key<T> key, Object source,
+  public InstanceBindingImpl(InjectorImpl injector, Key<T> key, Object source,
       InternalFactory<? extends T> internalFactory, Set<InjectionPoint> injectionPoints,
       T instance) {
     super(injector, key, source, internalFactory, Scoping.UNSCOPED);
diff --git a/src/com/google/inject/InterceptorBindingProcessor.java b/src/com/google/inject/internal/InterceptorBindingProcessor.java
similarity index 85%
rename from src/com/google/inject/InterceptorBindingProcessor.java
rename to src/com/google/inject/internal/InterceptorBindingProcessor.java
index 6c96ae0..e352672 100644
--- a/src/com/google/inject/InterceptorBindingProcessor.java
+++ b/src/com/google/inject/internal/InterceptorBindingProcessor.java
@@ -14,18 +14,17 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
 import com.google.inject.spi.InterceptorBinding;
 
 /**
- * Handles {@link Binder#bindInterceptor} commands.
+ * Handles {@code Binder.bindInterceptor} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class InterceptorBindingProcessor extends AbstractProcessor {
+final class InterceptorBindingProcessor extends AbstractProcessor {
 
   InterceptorBindingProcessor(Errors errors) {
     super(errors);
diff --git a/src/com/google/inject/InterceptorStackCallback.java b/src/com/google/inject/internal/InterceptorStackCallback.java
similarity index 91%
rename from src/com/google/inject/InterceptorStackCallback.java
rename to src/com/google/inject/internal/InterceptorStackCallback.java
index 1e8e032..c9a7633 100644
--- a/src/com/google/inject/InterceptorStackCallback.java
+++ b/src/com/google/inject/internal/InterceptorStackCallback.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
 import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Method;
@@ -28,7 +28,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class InterceptorStackCallback implements net.sf.cglib.proxy.MethodInterceptor {
+final class InterceptorStackCallback implements net.sf.cglib.proxy.MethodInterceptor {
 
   final MethodInterceptor[] interceptors;
   final Method method;
@@ -44,7 +44,7 @@
     return new InterceptedMethodInvocation(proxy, methodProxy, arguments).proceed();
   }
 
-  class InterceptedMethodInvocation implements MethodInvocation {
+  private class InterceptedMethodInvocation implements MethodInvocation {
 
     final Object proxy;
     final Object[] arguments;
diff --git a/src/com/google/inject/internal/InternalContext.java b/src/com/google/inject/internal/InternalContext.java
index d8025ac..40b6132 100644
--- a/src/com/google/inject/internal/InternalContext.java
+++ b/src/com/google/inject/internal/InternalContext.java
@@ -25,7 +25,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public final class InternalContext {
+final class InternalContext {
 
   private Map<Object, ConstructionContext<?>> constructionContexts = Maps.newHashMap();
   private Dependency dependency;
diff --git a/src/com/google/inject/internal/InternalFactory.java b/src/com/google/inject/internal/InternalFactory.java
index ea3f33a..27d257a 100644
--- a/src/com/google/inject/internal/InternalFactory.java
+++ b/src/com/google/inject/internal/InternalFactory.java
@@ -23,7 +23,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public interface InternalFactory<T> {
+interface InternalFactory<T> {
 
   /**
    * Creates an object to be injected.
diff --git a/src/com/google/inject/InternalFactoryToProviderAdapter.java b/src/com/google/inject/internal/InternalFactoryToProviderAdapter.java
similarity index 82%
rename from src/com/google/inject/InternalFactoryToProviderAdapter.java
rename to src/com/google/inject/internal/InternalFactoryToProviderAdapter.java
index 82bebba..69e5c55 100644
--- a/src/com/google/inject/InternalFactoryToProviderAdapter.java
+++ b/src/com/google/inject/internal/InternalFactoryToProviderAdapter.java
@@ -14,20 +14,16 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
+import com.google.inject.Provider;
 import static com.google.inject.internal.Preconditions.checkNotNull;
-import com.google.inject.internal.SourceProvider;
 import com.google.inject.spi.Dependency;
 
 /**
  * @author crazybob@google.com (Bob Lee)
 */
-class InternalFactoryToProviderAdapter<T> implements InternalFactory<T> {
+final class InternalFactoryToProviderAdapter<T> implements InternalFactory<T> {
 
   private final Initializable<Provider<? extends T>> initializable;
   private final Object source;
diff --git a/src/com/google/inject/internal/LineNumbers.java b/src/com/google/inject/internal/LineNumbers.java
index dca16cd..05d1c29 100644
--- a/src/com/google/inject/internal/LineNumbers.java
+++ b/src/com/google/inject/internal/LineNumbers.java
@@ -35,7 +35,7 @@
  *
  * @author Chris Nokleberg
  */
-public class LineNumbers {
+final class LineNumbers {
 
   private final Class type;
   private final Map<String, Integer> lines = Maps.newHashMap();
diff --git a/src/com/google/inject/internal/LinkedBindingImpl.java b/src/com/google/inject/internal/LinkedBindingImpl.java
index 0b29e0a..f897230 100644
--- a/src/com/google/inject/internal/LinkedBindingImpl.java
+++ b/src/com/google/inject/internal/LinkedBindingImpl.java
@@ -16,17 +16,16 @@
 
 package com.google.inject.internal;
 
-import com.google.inject.Injector;
-import com.google.inject.Key;
 import com.google.inject.Binder;
+import com.google.inject.Key;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.LinkedKeyBinding;
 
-public final class LinkedBindingImpl<T> extends BindingImpl<T> implements LinkedKeyBinding<T> {
+final class LinkedBindingImpl<T> extends BindingImpl<T> implements LinkedKeyBinding<T> {
 
   final Key<? extends T> targetKey;
 
-  public LinkedBindingImpl(Injector injector, Key<T> key, Object source,
+  public LinkedBindingImpl(InjectorImpl injector, Key<T> key, Object source,
       InternalFactory<? extends T> internalFactory, Scoping scoping,
       Key<? extends T> targetKey) {
     super(injector, key, source, internalFactory, scoping);
diff --git a/src/com/google/inject/internal/LinkedProviderBindingImpl.java b/src/com/google/inject/internal/LinkedProviderBindingImpl.java
index 700b8a7..3438e8a 100644
--- a/src/com/google/inject/internal/LinkedProviderBindingImpl.java
+++ b/src/com/google/inject/internal/LinkedProviderBindingImpl.java
@@ -16,19 +16,18 @@
 
 package com.google.inject.internal;
 
-import com.google.inject.Injector;
+import com.google.inject.Binder;
 import com.google.inject.Key;
 import com.google.inject.Provider;
-import com.google.inject.Binder;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.ProviderKeyBinding;
 
-public final class LinkedProviderBindingImpl<T>
+final class LinkedProviderBindingImpl<T>
     extends BindingImpl<T> implements ProviderKeyBinding<T> {
 
   final Key<? extends Provider<? extends T>> providerKey;
 
-  public LinkedProviderBindingImpl(Injector injector, Key<T> key, Object source,
+  public LinkedProviderBindingImpl(InjectorImpl injector, Key<T> key, Object source,
       InternalFactory<? extends T> internalFactory, Scoping scoping,
       Key<? extends Provider<? extends T>> providerKey) {
     super(injector, key, source, internalFactory, scoping);
diff --git a/src/com/google/inject/LookupProcessor.java b/src/com/google/inject/internal/LookupProcessor.java
similarity index 87%
rename from src/com/google/inject/LookupProcessor.java
rename to src/com/google/inject/internal/LookupProcessor.java
index ff9b0ba..3971818 100644
--- a/src/com/google/inject/LookupProcessor.java
+++ b/src/com/google/inject/internal/LookupProcessor.java
@@ -14,20 +14,20 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
+import com.google.inject.MembersInjector;
+import com.google.inject.Provider;
 import com.google.inject.spi.MembersInjectorLookup;
 import com.google.inject.spi.ProviderLookup;
 
 /**
- * Handles {@link Binder#getProvider} and {@link Binder#getMembersInjector(TypeLiteral)} commands.
+ * Handles {@code Binder.getProvider} and {@code Binder.getMembersInjector(TypeLiteral)} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class LookupProcessor extends AbstractProcessor {
+final class LookupProcessor extends AbstractProcessor {
 
   LookupProcessor(Errors errors) {
     super(errors);
diff --git a/src/com/google/inject/Lookups.java b/src/com/google/inject/internal/Lookups.java
similarity index 83%
rename from src/com/google/inject/Lookups.java
rename to src/com/google/inject/internal/Lookups.java
index 183e2ae..f2cedbf 100644
--- a/src/com/google/inject/Lookups.java
+++ b/src/com/google/inject/internal/Lookups.java
@@ -14,7 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
+
+import com.google.inject.Provider;
+import com.google.inject.Key;
+import com.google.inject.MembersInjector;
+import com.google.inject.TypeLiteral;
 
 /**
  * Accessors for providers and members injectors. The returned values will not be functional until
diff --git a/src/com/google/inject/internal/MatcherAndConverter.java b/src/com/google/inject/internal/MatcherAndConverter.java
index 4c585a3..c31d1c3 100644
--- a/src/com/google/inject/internal/MatcherAndConverter.java
+++ b/src/com/google/inject/internal/MatcherAndConverter.java
@@ -24,7 +24,7 @@
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-public final class MatcherAndConverter {
+final class MatcherAndConverter {
 
   private final Matcher<? super TypeLiteral<?>> typeMatcher;
   private final TypeConverter typeConverter;
diff --git a/src/com/google/inject/MembersInjectorImpl.java b/src/com/google/inject/internal/MembersInjectorImpl.java
similarity index 92%
rename from src/com/google/inject/MembersInjectorImpl.java
rename to src/com/google/inject/internal/MembersInjectorImpl.java
index 082191f..090f75d 100644
--- a/src/com/google/inject/MembersInjectorImpl.java
+++ b/src/com/google/inject/internal/MembersInjectorImpl.java
@@ -14,13 +14,10 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.InternalContext;
+import com.google.inject.MembersInjector;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.InjectionListener;
 import com.google.inject.spi.InjectionPoint;
 
@@ -29,7 +26,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class MembersInjectorImpl<T> implements MembersInjector<T> {
+final class MembersInjectorImpl<T> implements MembersInjector<T> {
   private final TypeLiteral<T> typeLiteral;
   private final InjectorImpl injector;
   private final ImmutableList<SingleMemberInjector> memberInjectors;
diff --git a/src/com/google/inject/MembersInjectorStore.java b/src/com/google/inject/internal/MembersInjectorStore.java
similarity index 93%
rename from src/com/google/inject/MembersInjectorStore.java
rename to src/com/google/inject/internal/MembersInjectorStore.java
index ce88d2c..417c437 100644
--- a/src/com/google/inject/MembersInjectorStore.java
+++ b/src/com/google/inject/internal/MembersInjectorStore.java
@@ -14,13 +14,10 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.FailableCache;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.Lists;
+import com.google.inject.ConfigurationException;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.InjectionPoint;
 import com.google.inject.spi.TypeListenerBinding;
 import java.lang.reflect.Field;
@@ -32,7 +29,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class MembersInjectorStore {
+final class MembersInjectorStore {
   private final InjectorImpl injector;
   private final ImmutableList<TypeListenerBinding> typeListenerBindings;
 
diff --git a/src/com/google/inject/MessageProcessor.java b/src/com/google/inject/internal/MessageProcessor.java
similarity index 89%
rename from src/com/google/inject/MessageProcessor.java
rename to src/com/google/inject/internal/MessageProcessor.java
index 99b3d09..23f9d92 100644
--- a/src/com/google/inject/MessageProcessor.java
+++ b/src/com/google/inject/internal/MessageProcessor.java
@@ -14,20 +14,20 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
+import com.google.inject.Guice;
 import com.google.inject.spi.Message;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
- * Handles {@link Binder#addError} commands.
+ * Handles {@code Binder.addError} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class MessageProcessor extends AbstractProcessor {
+final class MessageProcessor extends AbstractProcessor {
 
   private static final Logger logger = Logger.getLogger(Guice.class.getName());
 
diff --git a/src/com/google/inject/MethodAspect.java b/src/com/google/inject/internal/MethodAspect.java
similarity index 89%
rename from src/com/google/inject/MethodAspect.java
rename to src/com/google/inject/internal/MethodAspect.java
index f9f35bb..f9377a3 100644
--- a/src/com/google/inject/MethodAspect.java
+++ b/src/com/google/inject/internal/MethodAspect.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
 import static com.google.inject.internal.Preconditions.checkNotNull;
 import com.google.inject.matcher.Matcher;
@@ -28,11 +28,11 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class MethodAspect {
+final class MethodAspect {
 
-  final Matcher<? super Class<?>> classMatcher;
-  final Matcher<? super Method> methodMatcher;
-  final List<MethodInterceptor> interceptors;
+  private final Matcher<? super Class<?>> classMatcher;
+  private final Matcher<? super Method> methodMatcher;
+  private final List<MethodInterceptor> interceptors;
 
   /**
    * @param classMatcher matches classes the interceptor should apply to. For example: {@code
diff --git a/src/com/google/inject/PrivateElementProcessor.java b/src/com/google/inject/internal/PrivateElementProcessor.java
similarity index 85%
rename from src/com/google/inject/PrivateElementProcessor.java
rename to src/com/google/inject/internal/PrivateElementProcessor.java
index a767b9f..33d2fbe 100644
--- a/src/com/google/inject/PrivateElementProcessor.java
+++ b/src/com/google/inject/internal/PrivateElementProcessor.java
@@ -14,19 +14,18 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.Lists;
+import com.google.inject.Stage;
 import com.google.inject.spi.PrivateElements;
 import java.util.List;
 
 /**
- * Handles {@link Binder#newPrivateBinder()} elements.
+ * Handles {@code Binder.newPrivateBinder()} elements.
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class PrivateElementProcessor extends AbstractProcessor {
+final class PrivateElementProcessor extends AbstractProcessor {
 
   private final Stage stage;
   private final List<InjectorShell.Builder> injectorShellBuilders = Lists.newArrayList();
diff --git a/src/com/google/inject/internal/ProviderInstanceBindingImpl.java b/src/com/google/inject/internal/ProviderInstanceBindingImpl.java
index 907e000..1bf8e97 100644
--- a/src/com/google/inject/internal/ProviderInstanceBindingImpl.java
+++ b/src/com/google/inject/internal/ProviderInstanceBindingImpl.java
@@ -16,10 +16,9 @@
 
 package com.google.inject.internal;
 
-import com.google.inject.Injector;
+import com.google.inject.Binder;
 import com.google.inject.Key;
 import com.google.inject.Provider;
-import com.google.inject.Binder;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.HasDependencies;
@@ -27,13 +26,13 @@
 import com.google.inject.spi.ProviderInstanceBinding;
 import java.util.Set;
 
-public final class ProviderInstanceBindingImpl<T> extends BindingImpl<T>
+final class ProviderInstanceBindingImpl<T> extends BindingImpl<T>
     implements ProviderInstanceBinding<T> {
 
   final Provider<? extends T> providerInstance;
   final ImmutableSet<InjectionPoint> injectionPoints;
 
-  public ProviderInstanceBindingImpl(Injector injector, Key<T> key,
+  public ProviderInstanceBindingImpl(InjectorImpl injector, Key<T> key,
       Object source, InternalFactory<? extends T> internalFactory, Scoping scoping,
       Provider<? extends T> providerInstance,
       Set<InjectionPoint> injectionPoints) {
diff --git a/src/com/google/inject/ProviderToInternalFactoryAdapter.java b/src/com/google/inject/internal/ProviderToInternalFactoryAdapter.java
similarity index 84%
rename from src/com/google/inject/ProviderToInternalFactoryAdapter.java
rename to src/com/google/inject/internal/ProviderToInternalFactoryAdapter.java
index 8c5a2eb..79b06f7 100644
--- a/src/com/google/inject/ProviderToInternalFactoryAdapter.java
+++ b/src/com/google/inject/internal/ProviderToInternalFactoryAdapter.java
@@ -14,18 +14,16 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
+import com.google.inject.Provider;
+import com.google.inject.ProvisionException;
 import com.google.inject.spi.Dependency;
 
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-class ProviderToInternalFactoryAdapter<T> implements Provider<T> {
+final class ProviderToInternalFactoryAdapter<T> implements Provider<T> {
 
   private final InjectorImpl injector;
   private final InternalFactory<? extends T> internalFactory;
diff --git a/src/com/google/inject/ProxyFactory.java b/src/com/google/inject/internal/ProxyFactory.java
similarity index 96%
rename from src/com/google/inject/ProxyFactory.java
rename to src/com/google/inject/internal/ProxyFactory.java
index c3c8a7a..ccd4b7c 100644
--- a/src/com/google/inject/ProxyFactory.java
+++ b/src/com/google/inject/internal/ProxyFactory.java
@@ -14,14 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BytecodeGen;
 import static com.google.inject.internal.BytecodeGen.newFastClass;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.ImmutableMap;
-import com.google.inject.internal.Lists;
-import com.google.inject.internal.Maps;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -43,7 +38,7 @@
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class ProxyFactory<T> implements ConstructionProxyFactory<T> {
+final class ProxyFactory<T> implements ConstructionProxyFactory<T> {
 
   private static final net.sf.cglib.proxy.MethodInterceptor NO_OP_METHOD_INTERCEPTOR
       = new net.sf.cglib.proxy.MethodInterceptor() {
diff --git a/src/com/google/inject/ScopeBindingProcessor.java b/src/com/google/inject/internal/ScopeBindingProcessor.java
similarity index 89%
rename from src/com/google/inject/ScopeBindingProcessor.java
rename to src/com/google/inject/internal/ScopeBindingProcessor.java
index 79bce81..e107c70 100644
--- a/src/com/google/inject/ScopeBindingProcessor.java
+++ b/src/com/google/inject/internal/ScopeBindingProcessor.java
@@ -14,21 +14,20 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Annotations;
-import com.google.inject.internal.Errors;
+import com.google.inject.Scope;
 import static com.google.inject.internal.Preconditions.checkNotNull;
 import com.google.inject.spi.ScopeBinding;
 import java.lang.annotation.Annotation;
 
 /**
- * Handles {@link Binder#bindScope} commands.
+ * Handles {@code Binder.bindScope} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class ScopeBindingProcessor extends AbstractProcessor {
+final class ScopeBindingProcessor extends AbstractProcessor {
 
   ScopeBindingProcessor(Errors errors) {
     super(errors);
diff --git a/src/com/google/inject/internal/Scoping.java b/src/com/google/inject/internal/Scoping.java
index a0b3583..8f10787 100644
--- a/src/com/google/inject/internal/Scoping.java
+++ b/src/com/google/inject/internal/Scoping.java
@@ -20,6 +20,8 @@
 import com.google.inject.Scopes;
 import com.google.inject.Singleton;
 import com.google.inject.Stage;
+import com.google.inject.Key;
+import com.google.inject.Provider;
 import com.google.inject.binder.ScopedBindingBuilder;
 import com.google.inject.spi.BindingScopingVisitor;
 import java.lang.annotation.Annotation;
@@ -206,4 +208,40 @@
   public abstract void applyTo(ScopedBindingBuilder scopedBindingBuilder);
 
   private Scoping() {}
+
+  /** Scopes an internal factory. */
+  static <T> InternalFactory<? extends T> scope(Key<T> key, InjectorImpl injector,
+      InternalFactory<? extends T> creator, Scoping scoping) {
+
+    if (scoping.isNoScope()) {
+      return creator;
+    }
+
+    Scope scope = scoping.getScopeInstance();
+
+    Provider<T> scoped
+        = scope.scope(key, new ProviderToInternalFactoryAdapter<T>(injector, creator));
+    return new InternalFactoryToProviderAdapter<T>(
+        Initializables.<Provider<? extends T>>of(scoped));
+  }
+
+  /**
+   * Replaces annotation scopes with instance scopes using the Injector's annotation-to-instance
+   * map. If the scope annotation has no corresponding instance, an error will be added and unscoped
+   * will be retuned.
+   */
+  static Scoping makeInjectable(Scoping scoping, InjectorImpl injector, Errors errors) {
+    Class<? extends Annotation> scopeAnnotation = scoping.getScopeAnnotation();
+    if (scopeAnnotation == null) {
+      return scoping;
+    }
+
+    Scope scope = injector.state.getScope(scopeAnnotation);
+    if (scope != null) {
+      return forInstance(scope);
+    }
+
+    errors.scopeNotFound(scopeAnnotation);
+    return UNSCOPED;
+  }
 }
diff --git a/src/com/google/inject/SingleFieldInjector.java b/src/com/google/inject/internal/SingleFieldInjector.java
similarity index 86%
rename from src/com/google/inject/SingleFieldInjector.java
rename to src/com/google/inject/internal/SingleFieldInjector.java
index 76ca8b2..3614105 100644
--- a/src/com/google/inject/SingleFieldInjector.java
+++ b/src/com/google/inject/internal/SingleFieldInjector.java
@@ -14,12 +14,8 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.Field;
@@ -27,7 +23,7 @@
 /**
  * Sets an injectable field.
  */
-class SingleFieldInjector implements SingleMemberInjector {
+final class SingleFieldInjector implements SingleMemberInjector {
   final Field field;
   final InjectionPoint injectionPoint;
   final Dependency<?> dependency;
diff --git a/src/com/google/inject/SingleMemberInjector.java b/src/com/google/inject/internal/SingleMemberInjector.java
similarity index 87%
rename from src/com/google/inject/SingleMemberInjector.java
rename to src/com/google/inject/internal/SingleMemberInjector.java
index 6401162..fea5733 100644
--- a/src/com/google/inject/SingleMemberInjector.java
+++ b/src/com/google/inject/internal/SingleMemberInjector.java
@@ -14,10 +14,8 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.InternalContext;
 import com.google.inject.spi.InjectionPoint;
 
 /**
diff --git a/src/com/google/inject/SingleMethodInjector.java b/src/com/google/inject/internal/SingleMethodInjector.java
similarity index 83%
rename from src/com/google/inject/SingleMethodInjector.java
rename to src/com/google/inject/internal/SingleMethodInjector.java
index 4479403..d0f4c95 100644
--- a/src/com/google/inject/SingleMethodInjector.java
+++ b/src/com/google/inject/internal/SingleMethodInjector.java
@@ -14,14 +14,10 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.InjectorImpl.MethodInvoker;
-import com.google.inject.internal.BytecodeGen;
 import com.google.inject.internal.BytecodeGen.Visibility;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
+import com.google.inject.internal.InjectorImpl.MethodInvoker;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -30,12 +26,12 @@
 /**
  * Invokes an injectable method.
  */
-class SingleMethodInjector implements SingleMemberInjector {
-  final MethodInvoker methodInvoker;
-  final SingleParameterInjector<?>[] parameterInjectors;
-  final InjectionPoint injectionPoint;
+final class SingleMethodInjector implements SingleMemberInjector {
+  private final MethodInvoker methodInvoker;
+  private final SingleParameterInjector<?>[] parameterInjectors;
+  private final InjectionPoint injectionPoint;
 
-  public SingleMethodInjector(InjectorImpl injector, InjectionPoint injectionPoint, Errors errors)
+  SingleMethodInjector(InjectorImpl injector, InjectionPoint injectionPoint, Errors errors)
       throws ErrorsException {
     this.injectionPoint = injectionPoint;
     final Method method = (Method) injectionPoint.getMember();
diff --git a/src/com/google/inject/SingleParameterInjector.java b/src/com/google/inject/internal/SingleParameterInjector.java
similarity index 89%
rename from src/com/google/inject/SingleParameterInjector.java
rename to src/com/google/inject/internal/SingleParameterInjector.java
index 075e74e..1f2de9d 100644
--- a/src/com/google/inject/SingleParameterInjector.java
+++ b/src/com/google/inject/internal/SingleParameterInjector.java
@@ -14,18 +14,14 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.InternalContext;
-import com.google.inject.internal.InternalFactory;
 import com.google.inject.spi.Dependency;
 
 /**
  * Resolves a single parameter, to be used in a constructor or method invocation.
  */
-class SingleParameterInjector<T> {
+final class SingleParameterInjector<T> {
   private static final Object[] NO_ARGUMENTS = {}; 
 
   private final Dependency<T> dependency;
diff --git a/src/com/google/inject/internal/SourceProvider.java b/src/com/google/inject/internal/SourceProvider.java
index 29f4508..75dcc9d 100644
--- a/src/com/google/inject/internal/SourceProvider.java
+++ b/src/com/google/inject/internal/SourceProvider.java
@@ -24,17 +24,13 @@
  * 
  * @author crazybob@google.com (Bob Lee)
  */
-public class SourceProvider {
+public final class SourceProvider {
 
   /** Indicates that the source is unknown. */
   public static final Object UNKNOWN_SOURCE = "[unknown source]";
 
   private final ImmutableSet<String> classNamesToSkip;
 
-  public SourceProvider() {
-    this.classNamesToSkip = ImmutableSet.of(SourceProvider.class.getName());
-  }
-
   public static final SourceProvider DEFAULT_INSTANCE
       = new SourceProvider(ImmutableSet.of(SourceProvider.class.getName()));
 
diff --git a/src/com/google/inject/State.java b/src/com/google/inject/internal/State.java
similarity index 94%
rename from src/com/google/inject/State.java
rename to src/com/google/inject/internal/State.java
index d8cdb34..23e3f9a 100644
--- a/src/com/google/inject/State.java
+++ b/src/com/google/inject/internal/State.java
@@ -14,13 +14,12 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BindingImpl;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ImmutableList;
-import com.google.inject.internal.ImmutableSet;
-import com.google.inject.internal.MatcherAndConverter;
+import com.google.inject.Binding;
+import com.google.inject.Key;
+import com.google.inject.Scope;
+import com.google.inject.TypeLiteral;
 import com.google.inject.spi.TypeListenerBinding;
 import java.lang.annotation.Annotation;
 import java.util.List;
diff --git a/src/com/google/inject/internal/Stopwatch.java b/src/com/google/inject/internal/Stopwatch.java
index 268f913..22ab440 100644
--- a/src/com/google/inject/internal/Stopwatch.java
+++ b/src/com/google/inject/internal/Stopwatch.java
@@ -23,7 +23,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public class Stopwatch {
+final class Stopwatch {
   private static final Logger logger = Logger.getLogger(Stopwatch.class.getName());
 
   private long start = System.currentTimeMillis();
diff --git a/src/com/google/inject/TypeConverterBindingProcessor.java b/src/com/google/inject/internal/TypeConverterBindingProcessor.java
similarity index 92%
rename from src/com/google/inject/TypeConverterBindingProcessor.java
rename to src/com/google/inject/internal/TypeConverterBindingProcessor.java
index 967ec97..d7ca03c 100644
--- a/src/com/google/inject/TypeConverterBindingProcessor.java
+++ b/src/com/google/inject/internal/TypeConverterBindingProcessor.java
@@ -14,13 +14,9 @@
  * limitations under the License.
  */
 
+package com.google.inject.internal;
 
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.MatcherAndConverter;
-import com.google.inject.internal.SourceProvider;
-import com.google.inject.internal.Strings;
+import com.google.inject.TypeLiteral;
 import com.google.inject.matcher.AbstractMatcher;
 import com.google.inject.matcher.Matcher;
 import com.google.inject.matcher.Matchers;
@@ -31,19 +27,19 @@
 import java.lang.reflect.Type;
 
 /**
- * Handles {@link Binder#convertToTypes} commands.
+ * Handles {@code Binder.convertToTypes} commands.
  *
  * @author crazybob@google.com (Bob Lee)
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class TypeConverterBindingProcessor extends AbstractProcessor {
+final class TypeConverterBindingProcessor extends AbstractProcessor {
 
   TypeConverterBindingProcessor(Errors errors) {
     super(errors);
   }
 
   /** Installs default converters for primitives, enums, and class literals. */
-  public void prepareBuiltInConverters(InjectorImpl injector) {
+  void prepareBuiltInConverters(InjectorImpl injector) {
     this.injector = injector;
     try {
       // Configure type converters.
diff --git a/src/com/google/inject/TypeListenerBindingProcessor.java b/src/com/google/inject/internal/TypeListenerBindingProcessor.java
similarity index 83%
rename from src/com/google/inject/TypeListenerBindingProcessor.java
rename to src/com/google/inject/internal/TypeListenerBindingProcessor.java
index 01bc654..86d4a7c 100644
--- a/src/com/google/inject/TypeListenerBindingProcessor.java
+++ b/src/com/google/inject/internal/TypeListenerBindingProcessor.java
@@ -14,17 +14,16 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Errors;
 import com.google.inject.spi.TypeListenerBinding;
 
 /**
- * Handles {@link Binder#bindListener} commands.
+ * Handles {@code Binder#bindListener} commands.
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-class TypeListenerBindingProcessor extends AbstractProcessor {
+final class TypeListenerBindingProcessor extends AbstractProcessor {
 
   TypeListenerBindingProcessor(Errors errors) {
     super(errors);
diff --git a/src/com/google/inject/internal/UntargettedBindingImpl.java b/src/com/google/inject/internal/UntargettedBindingImpl.java
index 3e410e2..57ede84 100644
--- a/src/com/google/inject/internal/UntargettedBindingImpl.java
+++ b/src/com/google/inject/internal/UntargettedBindingImpl.java
@@ -16,16 +16,15 @@
 
 package com.google.inject.internal;
 
-import com.google.inject.Injector;
-import com.google.inject.Key;
 import com.google.inject.Binder;
+import com.google.inject.Key;
 import com.google.inject.spi.BindingTargetVisitor;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.UntargettedBinding;
 
-public class UntargettedBindingImpl<T> extends BindingImpl<T> implements UntargettedBinding<T> {
+final class UntargettedBindingImpl<T> extends BindingImpl<T> implements UntargettedBinding<T> {
 
-  public UntargettedBindingImpl(Injector injector, Key<T> key, Object source) {
+  UntargettedBindingImpl(InjectorImpl injector, Key<T> key, Object source) {
     super(injector, key, source, new InternalFactory<T>() {
       public T get(Errors errors, InternalContext context, Dependency<?> dependency) {
         throw new AssertionError();
diff --git a/src/com/google/inject/WeakKeySet.java b/src/com/google/inject/internal/WeakKeySet.java
similarity index 94%
rename from src/com/google/inject/WeakKeySet.java
rename to src/com/google/inject/internal/WeakKeySet.java
index de80a11..32e0e93 100644
--- a/src/com/google/inject/WeakKeySet.java
+++ b/src/com/google/inject/internal/WeakKeySet.java
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.Sets;
+import com.google.inject.Key;
 import java.util.Set;
 
 /**
diff --git a/src/com/google/inject/spi/DefaultElementVisitor.java b/src/com/google/inject/spi/DefaultElementVisitor.java
index cf8df75..f6f8aa9 100644
--- a/src/com/google/inject/spi/DefaultElementVisitor.java
+++ b/src/com/google/inject/spi/DefaultElementVisitor.java
@@ -63,7 +63,7 @@
     return visitOther(providerLookup);
   }
 
-  public V visit(InjectionRequest injectionRequest) {
+  public V visit(InjectionRequest<?> injectionRequest) {
     return visitOther(injectionRequest);
   }
 
diff --git a/src/com/google/inject/spi/ElementVisitor.java b/src/com/google/inject/spi/ElementVisitor.java
index fcff268..20f901c 100644
--- a/src/com/google/inject/spi/ElementVisitor.java
+++ b/src/com/google/inject/spi/ElementVisitor.java
@@ -54,7 +54,7 @@
   /**
    * Visit a request to inject the instance fields and methods of an instance.
    */
-  V visit(InjectionRequest request);
+  V visit(InjectionRequest<?> request);
 
   /**
    * Visit a request to inject the static fields and methods of type.
diff --git a/src/com/google/inject/spi/Elements.java b/src/com/google/inject/spi/Elements.java
index 06dc0f1..03871a7 100644
--- a/src/com/google/inject/spi/Elements.java
+++ b/src/com/google/inject/spi/Elements.java
@@ -137,7 +137,7 @@
       this.modules = Sets.newHashSet();
       this.elements = Lists.newArrayList();
       this.source = null;
-      this.sourceProvider = new SourceProvider().plusSkippedClasses(
+      this.sourceProvider = SourceProvider.DEFAULT_INSTANCE.plusSkippedClasses(
           Elements.class, RecordingBinder.class, AbstractModule.class,
           ConstantBindingBuilderImpl.class, AbstractBindingBuilder.class, BindingBuilder.class);
       this.parent = null;
diff --git a/test/com/google/inject/AllTests.java b/test/com/google/inject/AllTests.java
index 1d32f78..8d4378e 100644
--- a/test/com/google/inject/AllTests.java
+++ b/test/com/google/inject/AllTests.java
@@ -22,6 +22,7 @@
 import com.google.inject.internal.LineNumbersTest;
 import com.google.inject.internal.MapMakerTestSuite;
 import com.google.inject.internal.UniqueAnnotationsTest;
+import com.google.inject.internal.ProxyFactoryTest;
 import com.google.inject.matcher.MatcherTest;
 import com.google.inject.name.NamesTest;
 import com.google.inject.spi.BindingTargetVisitorTest;
diff --git a/test/com/google/inject/ReflectionTest.java b/test/com/google/inject/ReflectionTest.java
index 0d0fa1a..b601120 100644
--- a/test/com/google/inject/ReflectionTest.java
+++ b/test/com/google/inject/ReflectionTest.java
@@ -19,6 +19,7 @@
 import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import junit.framework.TestCase;
+import com.google.inject.internal.InjectorBuilder;
 
 /**
  * @author crazybob@google.com (Bob Lee)
diff --git a/test/com/google/inject/ProxyFactoryTest.java b/test/com/google/inject/internal/ProxyFactoryTest.java
similarity index 97%
rename from test/com/google/inject/ProxyFactoryTest.java
rename to test/com/google/inject/internal/ProxyFactoryTest.java
index 0e95ce7..c516d66 100644
--- a/test/com/google/inject/ProxyFactoryTest.java
+++ b/test/com/google/inject/internal/ProxyFactoryTest.java
@@ -14,10 +14,9 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.Lists;
+import com.google.inject.Inject;
 import static com.google.inject.matcher.Matchers.annotatedWith;
 import static com.google.inject.matcher.Matchers.any;
 import static com.google.inject.matcher.Matchers.not;
diff --git a/test/com/google/inject/spi/ElementsTest.java b/test/com/google/inject/spi/ElementsTest.java
index eff6328..233abf1 100644
--- a/test/com/google/inject/spi/ElementsTest.java
+++ b/test/com/google/inject/spi/ElementsTest.java
@@ -796,14 +796,14 @@
         },
 
         new FailingElementVisitor() {
-          @Override public Void visit(InjectionRequest command) {
+          @Override public Void visit(InjectionRequest<?> command) {
             assertEquals(firstObject, command.getInstance());
             return null;
           }
         },
 
         new FailingElementVisitor() {
-          @Override public Void visit(InjectionRequest command) {
+          @Override public Void visit(InjectionRequest<?> command) {
             assertEquals(secondObject, command.getInstance());
             return null;
           }