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;
           }
