diff --git a/extensions/commands/src/com/google/inject/commands/intercepting/InterceptingInjectorBuilder.java b/extensions/commands/src/com/google/inject/commands/intercepting/InterceptingInjectorBuilder.java
index decd8e2..57514f7 100644
--- a/extensions/commands/src/com/google/inject/commands/intercepting/InterceptingInjectorBuilder.java
+++ b/extensions/commands/src/com/google/inject/commands/intercepting/InterceptingInjectorBuilder.java
@@ -38,6 +38,7 @@
 import com.google.inject.spi.Element;
 import com.google.inject.spi.Elements;
 import com.google.inject.spi.ModuleWriter;
+import com.google.inject.spi.UntargettedBinding;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -165,7 +166,7 @@
       }
 
       binding.acceptTargetVisitor(new DefaultBindingTargetVisitor<T, Void>() {
-        @Override public Void visitUntargetted() {
+        @Override public Void visitUntargetted(UntargettedBinding<T> tUntargettedBinding) {
           throw new UnsupportedOperationException(
               String.format("Cannot intercept bare binding of %s.", key));
         }
diff --git a/src/com/google/inject/Binding.java b/src/com/google/inject/Binding.java
index c25d354..80b7cff 100644
--- a/src/com/google/inject/Binding.java
+++ b/src/com/google/inject/Binding.java
@@ -80,7 +80,7 @@
    * @param visitor to call back on
    * @since 2.0
    */
-  <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor);
+  <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor);
 
   /**
    * Accepts a scoping visitor. Invokes the visitor method specific to this binding's scoping.
diff --git a/src/com/google/inject/BindingImpl.java b/src/com/google/inject/BindingImpl.java
deleted file mode 100644
index 395a2a7..0000000
--- a/src/com/google/inject/BindingImpl.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (C) 2006 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingScopingVisitor;
-import com.google.inject.spi.ElementVisitor;
-
-/**
- * @author crazybob@google.com (Bob Lee)
- */
-abstract class BindingImpl<T> implements Binding<T> {
-
-  final InjectorImpl injector;
-  final Key<T> key;
-  final Object source;
-  final InternalFactory<? extends T> internalFactory;
-  final Scope scope;
-  final LoadStrategy loadStrategy;
-
-  BindingImpl(InjectorImpl injector, Key<T> key, Object source,
-      InternalFactory<? extends T> internalFactory, Scope scope, LoadStrategy loadStrategy) {
-    this.injector = injector;
-    this.key = key;
-    this.source = source;
-    this.internalFactory = internalFactory;
-    this.scope = scope;
-    this.loadStrategy = loadStrategy;
-  }
-
-  public Key<T> getKey() {
-    return key;
-  }
-
-  public Object getSource() {
-    return source;
-  }
-
-  volatile Provider<T> provider;
-
-  public Provider<T> getProvider() {
-    if (provider == null) {
-      provider = injector.getProvider(key);
-    }
-    return provider;
-  }
-
-  InternalFactory<? extends T> getInternalFactory() {
-    return internalFactory;
-  }
-
-  public Scope getScope() {
-    return this.scope;
-  }
-
-  /**
-   * Is this a constant binding? This returns true for constant bindings as
-   * well as toInstance() bindings.
-   */
-  boolean isConstant() {
-    return internalFactory instanceof ConstantFactory<?>;
-  }
-
-  LoadStrategy getLoadStrategy() {
-    return loadStrategy;
-  }
-
-  public <V> V acceptVisitor(ElementVisitor<V> visitor) {
-    return visitor.visitBinding(this);
-  }
-
-  public <V> V acceptScopingVisitor(BindingScopingVisitor<V> visitor) {
-    if (loadStrategy == LoadStrategy.EAGER) {
-      return visitor.visitEagerSingleton();
-    } else if (scope != Scopes.NO_SCOPE && scope != null) {
-      return visitor.visitScope(scope);
-    } else {
-      return visitor.visitNoScoping();
-    }
-  }
-
-  /**
-   * Perform any post-creation initialization, that could require construction
-   * of other bindings.
-   */
-  void initialize(InjectorImpl injector, Errors errors) throws ErrorsException {}
-
-  public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("provider", internalFactory)
-        .add("scope", scope)
-        .add("source", source)
-        .toString();
-  }
-}
\ No newline at end of file
diff --git a/src/com/google/inject/BindingProcessor.java b/src/com/google/inject/BindingProcessor.java
index b9442bf..2a1e77a 100644
--- a/src/com/google/inject/BindingProcessor.java
+++ b/src/com/google/inject/BindingProcessor.java
@@ -18,16 +18,30 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import com.google.inject.ExposedBindingImpl.Factory;
 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.spi.BindingScopingVisitor;
+import com.google.inject.internal.ExposedBindingImpl;
+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.ProviderInstanceBindingImpl;
+import com.google.inject.internal.Scoping;
+import com.google.inject.internal.UntargettedBindingImpl;
 import com.google.inject.spi.BindingTargetVisitor;
+import com.google.inject.spi.ConstructorBinding;
+import com.google.inject.spi.ConvertedConstantBinding;
+import com.google.inject.spi.ExposedBinding;
 import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.InstanceBinding;
+import com.google.inject.spi.LinkedKeyBinding;
 import com.google.inject.spi.PrivateEnvironment;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
+import com.google.inject.spi.ProviderBinding;
+import com.google.inject.spi.ProviderInstanceBinding;
+import com.google.inject.spi.ProviderKeyBinding;
+import com.google.inject.spi.UntargettedBinding;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -40,25 +54,6 @@
  */
 class BindingProcessor extends AbstractProcessor {
 
-  private static final BindingScopingVisitor<LoadStrategy> LOAD_STRATEGY_VISITOR
-      = new BindingScopingVisitor<LoadStrategy>() {
-    public LoadStrategy visitEagerSingleton() {
-      return LoadStrategy.EAGER;
-    }
-
-    public LoadStrategy visitScope(Scope scope) {
-      return LoadStrategy.LAZY;
-    }
-
-    public LoadStrategy visitScopeAnnotation(Class<? extends Annotation> scopeAnnotation) {
-      return LoadStrategy.LAZY;
-    }
-
-    public LoadStrategy visitNoScoping() {
-      return LoadStrategy.LAZY;
-    }
-  };
-
   private final List<CreationListener> creationListeners = Lists.newArrayList();
   private final Initializer initializer;
   private final List<Runnable> uninitializedBindings = Lists.newArrayList();
@@ -89,78 +84,62 @@
 
     validateKey(command.getSource(), command.getKey());
 
-    final LoadStrategy loadStrategy = command.acceptScopingVisitor(LOAD_STRATEGY_VISITOR);
-    final Scope scope = command.acceptScopingVisitor(new BindingScopingVisitor<Scope>() {
-      public Scope visitEagerSingleton() {
-        return Scopes.SINGLETON;
-      }
-
-      public Scope visitScope(Scope scope) {
-        return scope;
-      }
-
-      public Scope visitScopeAnnotation(Class<? extends Annotation> scopeAnnotation) {
-        Scope scope = injector.state.getScope(scopeAnnotation);
-        if (scope != null) {
-          return scope;
-        } else {
-          errors.scopeNotFound(scopeAnnotation);
-          return null;
-        }
-      }
-
-      public Scope visitNoScoping() {
-        return null;
-      }
-    });
+    final Scoping scoping = Scopes.makeInjectable(
+        ((BindingImpl<?>) command).getScoping(), injector, errors);
 
     command.acceptTargetVisitor(new BindingTargetVisitor<T, Void>() {
-      public Void visitInstance(T instance, Set<InjectionPoint> injectionPoints) {
+
+      public Void visitInstance(InstanceBinding<T> binding) {
+        Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
+        T instance = binding.getInstance();
         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, scope);
+        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
         putBinding(new InstanceBindingImpl<T>(injector, key, source, scopedFactory, injectionPoints,
             instance));
         return null;
       }
 
-      public Void visitProvider(Provider<? extends T> provider,
-          Set<InjectionPoint> injectionPoints) {
+      public Void visitProviderInstance(ProviderInstanceBinding<T> binding) {
+        Provider<? extends T> provider = binding.getProviderInstance();
+        Set<InjectionPoint> injectionPoints = binding.getInjectionPoints();
         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, scope);
-        putBinding(new ProviderInstanceBindingImpl<T>(injector, key, source, scopedFactory, scope,
-            provider, loadStrategy, injectionPoints));
+        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
+        putBinding(new ProviderInstanceBindingImpl<T>(injector, key, source, scopedFactory, scoping,
+            provider, injectionPoints));
         return null;
       }
 
-      public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
+      public Void visitProviderKey(ProviderKeyBinding<T> binding) {
+        Key<? extends Provider<? extends T>> providerKey = binding.getProviderKey();
         BoundProviderFactory<T> boundProviderFactory
             = new BoundProviderFactory<T>(injector, providerKey, source);
         creationListeners.add(boundProviderFactory);
         InternalFactory<? extends T> scopedFactory = Scopes.scope(
-            key, injector, (InternalFactory<? extends T>) boundProviderFactory, scope);
+            key, injector, (InternalFactory<? extends T>) boundProviderFactory, scoping);
         putBinding(new LinkedProviderBindingImpl<T>(
-                injector, key, source, scopedFactory, scope, providerKey, loadStrategy));
+            injector, key, source, scopedFactory, scoping, providerKey));
         return null;
       }
 
-      public Void visitKey(Key<? extends T> targetKey) {
-        if (key.equals(targetKey)) {
+      public Void visitLinkedKey(LinkedKeyBinding<T> binding) {
+        Key<? extends T> linkedKey = binding.getLinkedKey();
+        if (key.equals(linkedKey)) {
           errors.recursiveBinding();
         }
 
-        FactoryProxy<T> factory = new FactoryProxy<T>(injector, key, targetKey, source);
+        FactoryProxy<T> factory = new FactoryProxy<T>(injector, key, linkedKey, source);
         creationListeners.add(factory);
-        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scope);
-        putBinding(new LinkedBindingImpl<T>(
-            injector, key, source, scopedFactory, scope, targetKey, loadStrategy));
+        InternalFactory<? extends T> scopedFactory = Scopes.scope(key, injector, factory, scoping);
+        putBinding(
+            new LinkedBindingImpl<T>(injector, key, source, scopedFactory, scoping, linkedKey));
         return null;
       }
 
-      public Void visitUntargetted() {
+      public Void visitUntargetted(UntargettedBinding<T> untargetted) {
         // Error: Missing implementation.
         // Example: bind(Date.class).annotatedWith(Red.class);
         // We can't assume abstract types aren't injectable. They may have an
@@ -174,7 +153,7 @@
         // This cast is safe after the preceeding check.
         final BindingImpl<T> binding;
         try {
-          binding = injector.createUnitializedBinding(key, scope, source, loadStrategy, errors);
+          binding = injector.createUnitializedBinding(key, scoping, source, errors);
           putBinding(binding);
         } catch (ErrorsException e) {
           errors.merge(e.getErrors());
@@ -185,7 +164,8 @@
         uninitializedBindings.add(new Runnable() {
           public void run() {
             try {
-              binding.injector.initializeBinding(binding, errors.withSource(source));
+              ((InjectorImpl) binding.getInjector()).initializeBinding(
+                  binding, errors.withSource(source));
             } catch (ErrorsException e) {
               errors.merge(e.getErrors());
             }
@@ -195,23 +175,24 @@
         return null;
       }
 
-      public Void visitExposed(PrivateEnvironment privateEnvironment) {
-        Factory<T> factory = new Factory<T>(key, privateEnvironment);
-        creationListeners.add(factory);
-        putBinding(new ExposedBindingImpl<T>(injector, source, factory));
+      public Void visitExposed(ExposedBinding<T> binding) {
+        PrivateEnvironment privateEnvironment = binding.getPrivateEnvironment();
+        ExposedKeyFactory<T> exposedKeyFactory = new ExposedKeyFactory<T>(key, privateEnvironment);
+        creationListeners.add(exposedKeyFactory);
+        putBinding(new ExposedBindingImpl<T>(
+            injector, source, key, exposedKeyFactory, privateEnvironment));
         return null;
       }
 
-      public Void visitConvertedConstant(T value) {
+      public Void visitConvertedConstant(ConvertedConstantBinding<T> binding) {
         throw new IllegalArgumentException("Cannot apply a non-module element");
       }
 
-      public Void visitConstructor(Constructor<? extends T> constructor,
-          Set<InjectionPoint> injectionPoints) {
+      public Void visitConstructor(ConstructorBinding<T> binding) {
         throw new IllegalArgumentException("Cannot apply a non-module element");
       }
 
-      public Void visitProviderBinding(Key<?> provided) {
+      public Void visitProviderBinding(ProviderBinding<?> binding) {
         throw new IllegalArgumentException("Cannot apply a non-module element");
       }
     });
@@ -223,8 +204,8 @@
     Annotations.checkForMisplacedScopeAnnotations(key.getRawType(), source, errors);
   }
 
-  <T> InvalidBindingImpl<T> invalidBinding(InjectorImpl injector, Key<T> key, Object source) {
-    return new InvalidBindingImpl<T>(injector, key, source);
+  <T> UntargettedBindingImpl<T> invalidBinding(InjectorImpl injector, Key<T> key, Object source) {
+    return new UntargettedBindingImpl<T>(injector, key, source);
   }
 
   public void initializeBindings() {
@@ -269,7 +250,7 @@
     if (original instanceof ExposedBindingImpl) {
       ExposedBindingImpl exposed = (ExposedBindingImpl) original;
       InjectorImpl exposedFrom = environmentToInjector.get(exposed.getPrivateEnvironment());
-      return (exposedFrom == binding.injector);
+      return (exposedFrom == binding.getInjector());
     }
     return false;
   }
diff --git a/src/com/google/inject/BoundProviderFactory.java b/src/com/google/inject/BoundProviderFactory.java
index 8419653..8941750 100644
--- a/src/com/google/inject/BoundProviderFactory.java
+++ b/src/com/google/inject/BoundProviderFactory.java
@@ -19,6 +19,8 @@
 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.spi.Dependency;
 import com.google.inject.spi.PrivateEnvironment;
 import java.util.Map;
diff --git a/src/com/google/inject/ClassBindingImpl.java b/src/com/google/inject/ClassBindingImpl.java
index 81b33dd..5175c3a 100644
--- a/src/com/google/inject/ClassBindingImpl.java
+++ b/src/com/google/inject/ClassBindingImpl.java
@@ -19,44 +19,58 @@
 import static com.google.common.base.Preconditions.checkState;
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.InjectorImpl.LateBoundConstructor;
+import com.google.inject.internal.BindingImpl;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.ErrorsException;
+import com.google.inject.internal.InternalFactory;
+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;
 import com.google.inject.spi.InjectionPoint;
+import java.lang.reflect.Constructor;
+import java.util.Set;
 
-/**
- *
- *
- */
-class ClassBindingImpl<T> extends BindingImpl<T> {
+class ClassBindingImpl<T> extends BindingImpl<T> implements ConstructorBinding<T> {
 
   private final LateBoundConstructor<T> lateBoundConstructor;
   private ImmutableSet<InjectionPoint> injectionPoints;
 
-  ClassBindingImpl(InjectorImpl injector, Key<T> key, Object source,
-      InternalFactory<? extends T> internalFactory, Scope scope,
-      LateBoundConstructor<T> lateBoundConstructor,
-      LoadStrategy loadStrategy) {
-    super(injector, key, source, internalFactory, scope, loadStrategy);
+  ClassBindingImpl(Injector injector, Key<T> key, Object source,
+      InternalFactory<? extends T> internalFactory, Scoping scoping,
+      LateBoundConstructor<T> lateBoundConstructor) {
+    super(injector, key, source, internalFactory, scoping);
     this.lateBoundConstructor = lateBoundConstructor;
   }
 
-  @Override void initialize(InjectorImpl injector, Errors errors) throws ErrorsException {
+  @Override public void initialize(Injector injector, Errors errors) throws ErrorsException {
     lateBoundConstructor.bind(injector, getKey().getTypeLiteral(), errors);
     injectionPoints = lateBoundConstructor.constructorInjector.getInjectionPoints();
   }
 
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
     checkState(injectionPoints != null, "not initialized");
-    return visitor.visitConstructor(lateBoundConstructor.getConstructor(), injectionPoints);
+    return visitor.visitConstructor(this);
+  }
+
+  public Constructor<? extends T> getConstructor() {
+    return lateBoundConstructor.getConstructor();
+  }
+
+  public Set<InjectionPoint> getInjectionPoints() {
+    return injectionPoints;
+  }
+
+  public Set<Dependency<?>> getDependencies() {
+    return Dependency.forInjectionPoints(injectionPoints);
   }
 
   @Override public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("type", getKey().getTypeLiteral())
-        .add("scope", scope)
-        .add("source", source)
+    return new ToStringBuilder(ConstructorBinding.class)
+        .add("key", getKey())
+        .add("scope", getScoping())
+        .add("source", getSource())
         .toString();
   }
 }
diff --git a/src/com/google/inject/ConstantFactory.java b/src/com/google/inject/ConstantFactory.java
index 50b67f2..291a10d 100644
--- a/src/com/google/inject/ConstantFactory.java
+++ b/src/com/google/inject/ConstantFactory.java
@@ -18,6 +18,8 @@
 
 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;
 
diff --git a/src/com/google/inject/ConstructorInjector.java b/src/com/google/inject/ConstructorInjector.java
index 1699835..aa75a4f 100644
--- a/src/com/google/inject/ConstructorInjector.java
+++ b/src/com/google/inject/ConstructorInjector.java
@@ -18,8 +18,10 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.internal.ConstructionContext;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.ErrorsException;
+import com.google.inject.internal.InternalContext;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/src/com/google/inject/ContextualCallable.java b/src/com/google/inject/ContextualCallable.java
index 4ead596..e4f6c5f 100644
--- a/src/com/google/inject/ContextualCallable.java
+++ b/src/com/google/inject/ContextualCallable.java
@@ -17,6 +17,7 @@
 package com.google.inject;
 
 import com.google.inject.internal.ErrorsException;
+import com.google.inject.internal.InternalContext;
 
 /**
  * @author crazybob@google.com (Bob Lee)
diff --git a/src/com/google/inject/ExposedBindingImpl.java b/src/com/google/inject/ExposedBindingImpl.java
deleted file mode 100644
index c414598..0000000
--- a/src/com/google/inject/ExposedBindingImpl.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Copyright (C) 2008 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingTargetVisitor;
-import com.google.inject.spi.Dependency;
-import com.google.inject.spi.PrivateEnvironment;
-import java.util.Map;
-
-class ExposedBindingImpl<T> extends BindingImpl<T> {
-
-  private Factory factory;
-
-  public ExposedBindingImpl(InjectorImpl injector, Object source, Factory<T> factory) {
-    super(injector, factory.key, source, factory, Scopes.NO_SCOPE, LoadStrategy.LAZY);
-    this.factory = factory;
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return visitor.visitExposed(factory.privateEnvironment);
-  }
-
-  public PrivateEnvironment getPrivateEnvironment() {
-    return factory.privateEnvironment;
-  }
-
-  @Override public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("privateEnvironment", factory.privateEnvironment)
-        .add("scope", scope)
-        .add("source", source)
-        .toString();
-  }
-
-  static class Factory<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
-    private final Key<T> key;
-    private final PrivateEnvironment privateEnvironment;
-    private BindingImpl<T> delegate;
-
-    Factory(Key<T> key, PrivateEnvironment privateEnvironment) {
-      this.key = key;
-      this.privateEnvironment = privateEnvironment;
-    }
-
-    public void notify(Map<PrivateEnvironment, InjectorImpl> privateInjectors, Errors errors) {
-      InjectorImpl privateInjector = privateInjectors.get(privateEnvironment);
-      BindingImpl<T> explicitBinding = privateInjector.state.getExplicitBinding(key);
-
-      if (explicitBinding.getInternalFactory() == this) {
-        errors.withSource(explicitBinding.getSource()).exposedButNotBound(key);
-        return;
-      }
-
-      this.delegate = explicitBinding;
-    }
-
-    public T get(Errors errors, InternalContext context, Dependency<?> dependency)
-        throws ErrorsException {
-      return delegate.getInternalFactory().get(errors, context, dependency);
-    }
-  }
-}
diff --git a/src/com/google/inject/ExposedKeyFactory.java b/src/com/google/inject/ExposedKeyFactory.java
new file mode 100644
index 0000000..0ecff01
--- /dev/null
+++ b/src/com/google/inject/ExposedKeyFactory.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject;
+
+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.spi.Dependency;
+import com.google.inject.spi.PrivateEnvironment;
+import java.util.Map;
+
+class ExposedKeyFactory<T> implements InternalFactory<T>, BindingProcessor.CreationListener {
+  private final Key<T> key;
+  private final PrivateEnvironment privateEnvironment;
+  private BindingImpl<T> delegate;
+
+  public ExposedKeyFactory(Key<T> key, PrivateEnvironment privateEnvironment) {
+    this.key = key;
+    this.privateEnvironment = privateEnvironment;
+  }
+
+  public void notify(Map<PrivateEnvironment, InjectorImpl> privateInjectors, Errors errors) {
+    InjectorImpl privateInjector = privateInjectors.get(privateEnvironment);
+    BindingImpl<T> explicitBinding = privateInjector.state.getExplicitBinding(key);
+
+    if (explicitBinding.getInternalFactory() == this) {
+      errors.withSource(explicitBinding.getSource()).exposedButNotBound(key);
+      return;
+    }
+
+    this.delegate = explicitBinding;
+  }
+
+  public T get(Errors errors, InternalContext context, Dependency<?> dependency)
+      throws ErrorsException {
+    return delegate.getInternalFactory().get(errors, context, dependency);
+  }
+}
diff --git a/src/com/google/inject/FactoryProxy.java b/src/com/google/inject/FactoryProxy.java
index afcafb5..761450a 100644
--- a/src/com/google/inject/FactoryProxy.java
+++ b/src/com/google/inject/FactoryProxy.java
@@ -19,6 +19,8 @@
 
 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;
 import com.google.inject.spi.PrivateEnvironment;
diff --git a/src/com/google/inject/InheritingState.java b/src/com/google/inject/InheritingState.java
index 2faa186..7aef60d 100644
--- a/src/com/google/inject/InheritingState.java
+++ b/src/com/google/inject/InheritingState.java
@@ -19,12 +19,13 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.inject.internal.BindingImpl;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.MatcherAndConverter;
 import java.lang.annotation.Annotation;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Collections;
 
 /**
  * @author jessewilson@google.com (Jesse Wilson)
diff --git a/src/com/google/inject/InjectionRequestProcessor.java b/src/com/google/inject/InjectionRequestProcessor.java
index 538e437..98bea85 100644
--- a/src/com/google/inject/InjectionRequestProcessor.java
+++ b/src/com/google/inject/InjectionRequestProcessor.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Lists;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.ErrorsException;
+import com.google.inject.internal.InternalContext;
 import com.google.inject.spi.InjectionPoint;
 import com.google.inject.spi.InjectionRequest;
 import com.google.inject.spi.StaticInjectionRequest;
diff --git a/src/com/google/inject/InjectorBuilder.java b/src/com/google/inject/InjectorBuilder.java
index b313b02..d7203f5 100644
--- a/src/com/google/inject/InjectorBuilder.java
+++ b/src/com/google/inject/InjectorBuilder.java
@@ -19,8 +19,10 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
+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.Stopwatch;
 import com.google.inject.spi.Dependency;
 import com.google.inject.spi.PrivateEnvironment;
@@ -188,16 +190,15 @@
         (Collection) injector.state.getExplicitBindingsThisLevel().values(),
         injector.jitBindings.values()));
     for (final BindingImpl<?> binding : candidateBindings) {
-      if ((stage == Stage.PRODUCTION && binding.getScope() == Scopes.SINGLETON)
-          || binding.getLoadStrategy() == LoadStrategy.EAGER) {
+      if (binding.getScoping().isEagerSingleton(stage)) {
         try {
           injector.callInContext(new ContextualCallable<Void>() {
-            Dependency<?> dependency = Dependency.get(binding.key);
+            Dependency<?> dependency = Dependency.get(binding.getKey());
             public Void call(InternalContext context) {
               context.setDependency(dependency);
               Errors errorsForBinding = errors.withSource(dependency);
               try {
-                binding.internalFactory.get(errorsForBinding, context, dependency);
+                binding.getInternalFactory().get(errorsForBinding, context, dependency);
               } catch (ErrorsException e) {
                 errorsForBinding.merge(e.getErrors());
               } finally {
diff --git a/src/com/google/inject/InjectorImpl.java b/src/com/google/inject/InjectorImpl.java
index 0ef6f24..c767415 100644
--- a/src/com/google/inject/InjectorImpl.java
+++ b/src/com/google/inject/InjectorImpl.java
@@ -25,16 +25,26 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
 import com.google.inject.internal.Annotations;
+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.FailableCache;
+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.MatcherAndConverter;
+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;
 import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.ProviderBinding;
 import com.google.inject.util.Providers;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.AnnotatedElement;
@@ -95,7 +105,7 @@
   }
 
   public <T> List<Binding<T>> findBindingsByType(TypeLiteral<T> type) {
-    return Collections.<Binding<T>>unmodifiableList(bindingsMultimap.getAll(type));
+    return bindingsMultimap.getAll(type);
   }
 
   /** Returns the binding for {@code key} */
@@ -175,8 +185,8 @@
   }
 
   /** Creates a synthetic binding to Provider<T>, i.e. a binding to the provider from Binding<T>. */
-  private <T> BindingImpl<Provider<T>> createProviderBinding(Key<Provider<T>> key,
-      LoadStrategy loadStrategy, Errors errors) throws ErrorsException {
+  private <T> BindingImpl<Provider<T>> createProviderBinding(Key<Provider<T>> key, Errors errors)
+      throws ErrorsException {
     Type providerType = key.getTypeLiteral().getType();
 
     // If the Provider has no type parameter (raw Provider)...
@@ -190,24 +200,16 @@
     Key<T> providedKey = (Key<T>) key.ofType(entryType);
 
     BindingImpl<T> delegate = getBindingOrThrow(providedKey, errors);
-    return new ProviderBindingImpl<T>(this, key, delegate, loadStrategy);
+    return new ProviderBindingImpl<T>(this, key, delegate);
   }
 
-  static class ProviderBindingImpl<T> extends BindingImpl<Provider<T>> {
+  static class ProviderBindingImpl<T> extends BindingImpl<Provider<T>>
+      implements ProviderBinding<T> {
     final BindingImpl<T> providedBinding;
 
-    ProviderBindingImpl(
-        InjectorImpl injector,
-        Key<Provider<T>> key,
-        Binding<T> providedBinding,
-        LoadStrategy loadStrategy) {
-      super(
-          injector,
-          key,
-          providedBinding.getSource(),
-          createInternalFactory(providedBinding),
-          Scopes.NO_SCOPE,
-          loadStrategy);
+    ProviderBindingImpl(InjectorImpl injector, Key<Provider<T>> key, Binding<T> providedBinding) {
+      super(injector, key, providedBinding.getSource(), createInternalFactory(providedBinding),
+          Scoping.UNSCOPED);
       this.providedBinding = (BindingImpl<T>) providedBinding;
     }
 
@@ -220,8 +222,12 @@
       };
     }
 
-    public <V> V acceptTargetVisitor(BindingTargetVisitor<? super Provider<T>, V> visitor) {
-      return visitor.visitProviderBinding(providedBinding.getKey());
+    public Key<? extends T> getProvidedKey() {
+      return providedBinding.getKey();
+    }
+
+    public <V> V acceptTargetVisitor(BindingTargetVisitor<Provider<T>, V> visitor) {
+      return visitor.visitProviderBinding(this);
     }
   }
 
@@ -276,15 +282,16 @@
     }
   }
 
-  private static class ConvertedConstantBindingImpl<T> extends BindingImpl<T> {
+  private static class ConvertedConstantBindingImpl<T>
+      extends BindingImpl<T> implements ConvertedConstantBinding<T> {
     final T value;
     final Provider<T> provider;
     final Binding<String> originalBinding;
 
     ConvertedConstantBindingImpl(
-        InjectorImpl injector, Key<T> key, T value, Binding<String> originalBinding) {
+        Injector injector, Key<T> key, T value, Binding<String> originalBinding) {
       super(injector, key, originalBinding.getSource(),
-          new ConstantFactory<T>(Initializables.of(value)), Scopes.NO_SCOPE, LoadStrategy.LAZY);
+          new ConstantFactory<T>(Initializables.of(value)), Scoping.UNSCOPED);
       this.value = value;
       provider = Providers.of(value);
       this.originalBinding = originalBinding;
@@ -294,13 +301,21 @@
       return provider;
     }
 
-    public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-      return visitor.visitConvertedConstant(value);
+    public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+      return visitor.visitConvertedConstant(this);
+    }
+
+    public T getValue() {
+      return value;
+    }
+
+    public Set<Dependency<?>> getDependencies() {
+      return ImmutableSet.<Dependency<?>>of(Dependency.get(originalBinding.getKey()));
     }
 
     @Override public String toString() {
-      return new ToStringBuilder(Binding.class)
-          .add("key", key)
+      return new ToStringBuilder(ConvertedConstantBinding.class)
+          .add("key", getKey())
           .add("value", value)
           .add("original", originalBinding)
           .toString();
@@ -331,8 +346,8 @@
    * Creates a binding for an injectable type with the given scope. Looks for a scope on the type if
    * none is specified.
    */
-  <T> BindingImpl<T> createUnitializedBinding(Key<T> key, Scope scope, Object source,
-      LoadStrategy loadStrategy, Errors errors) throws ErrorsException {
+  <T> BindingImpl<T> createUnitializedBinding(Key<T> key, Scoping scoping, Object source,
+      Errors errors) throws ErrorsException {
     Class<?> rawType = key.getTypeLiteral().getRawType();
 
     // Don't try to inject arrays, or enums.
@@ -352,14 +367,14 @@
     ImplementedBy implementedBy = rawType.getAnnotation(ImplementedBy.class);
     if (implementedBy != null) {
       Annotations.checkForMisplacedScopeAnnotations(rawType, source, errors);
-      return createImplementedByBinding(key, scope, implementedBy, loadStrategy, errors);
+      return createImplementedByBinding(key, scoping, implementedBy, errors);
     }
 
     // Handle @ProvidedBy.
     ProvidedBy providedBy = rawType.getAnnotation(ProvidedBy.class);
     if (providedBy != null) {
       Annotations.checkForMisplacedScopeAnnotations(rawType, source, errors);
-      return createProvidedByBinding(key, scope, providedBy, loadStrategy, errors);
+      return createProvidedByBinding(key, scoping, providedBy, errors);
     }
 
     // We can't inject abstract classes.
@@ -374,22 +389,20 @@
       throw errors.cannotInjectInnerClass(rawType).toException();
     }
 
-    if (scope == null) {
-      Class<? extends Annotation> scopeAnnotation
-          = Annotations.findScopeAnnotation(errors, rawType);
+    LateBoundConstructor<T> lateBoundConstructor = new LateBoundConstructor<T>();
+
+    if (!scoping.isExplicitlyScoped()) {
+      Class<? extends Annotation> scopeAnnotation = findScopeAnnotation(errors, rawType);
       if (scopeAnnotation != null) {
-        scope = state.getScope(scopeAnnotation);
-        if (scope == null) {
-          errors.withSource(rawType).scopeNotFound(scopeAnnotation);
-        }
+        scoping = Scopes.makeInjectable(Scoping.forAnnotation(scopeAnnotation),
+            this, errors.withSource(rawType));
       }
     }
 
-    LateBoundConstructor<T> lateBoundConstructor = new LateBoundConstructor<T>();
     InternalFactory<? extends T> scopedFactory
-        = Scopes.scope(key, this, lateBoundConstructor, scope);
+        = Scopes.scope(key, this, lateBoundConstructor, scoping);
     return new ClassBindingImpl<T>(
-        this, key, source, scopedFactory, scope, lateBoundConstructor, loadStrategy);
+        this, key, source, scopedFactory, scoping, lateBoundConstructor);
   }
 
   /**
@@ -426,10 +439,11 @@
     ConstructorInjector<T> constructorInjector;
 
     @SuppressWarnings("unchecked") // the constructor T is the same as the implementation T
-    void bind(InjectorImpl injector, TypeLiteral<T> implementation, Errors errors)
+    void bind(Injector injector, TypeLiteral<T> implementation, Errors errors)
         throws ErrorsException {
+      InjectorImpl injectorImpl = (InjectorImpl) injector;
       constructorInjector
-          = (ConstructorInjector<T>) injector.constructors.get(implementation, errors);
+          = (ConstructorInjector<T>) injectorImpl.constructors.get(implementation, errors);
     }
 
     public Constructor<T> getConstructor() {
@@ -450,8 +464,8 @@
   }
 
   /** Creates a binding for a type annotated with @ProvidedBy. */
-  <T> BindingImpl<T> createProvidedByBinding(Key<T> key, Scope scope,
-      ProvidedBy providedBy, LoadStrategy loadStrategy, Errors errors) throws ErrorsException {
+  <T> BindingImpl<T> createProvidedByBinding(Key<T> key, Scoping scoping,
+      ProvidedBy providedBy, Errors errors) throws ErrorsException {
     final Class<?> rawType = key.getTypeLiteral().getRawType();
     final Class<? extends Provider<?>> providerType = providedBy.value();
 
@@ -471,7 +485,8 @@
       public T get(Errors errors, InternalContext context, Dependency dependency)
           throws ErrorsException {
         errors = errors.withSource(providerKey);
-        Provider<?> provider = providerBinding.internalFactory.get(errors, context, dependency);
+        Provider<?> provider = providerBinding.getInternalFactory().get(
+            errors, context, dependency);
         try {
           Object o = provider.get();
           if (o != null && !rawType.isInstance(o)) {
@@ -490,15 +505,14 @@
         this,
         key,
         rawType /* source */,
-        Scopes.<T>scope(key, this, internalFactory, scope),
-        scope,
-        providerKey,
-        loadStrategy);
+        Scopes.<T>scope(key, this, internalFactory, scoping),
+        scoping,
+        providerKey);
   }
 
   /** Creates a binding for a type annotated with @ImplementedBy. */
-  <T> BindingImpl<T> createImplementedByBinding(Key<T> key, Scope scope,
-      ImplementedBy implementedBy, LoadStrategy loadStrategy, Errors errors)
+  <T> BindingImpl<T> createImplementedByBinding(Key<T> key, Scoping scoping,
+      ImplementedBy implementedBy, Errors errors)
       throws ErrorsException {
     Class<?> rawType = key.getTypeLiteral().getRawType();
     Class<?> implementationType = implementedBy.value();
@@ -523,7 +537,8 @@
     InternalFactory<T> internalFactory = new InternalFactory<T>() {
       public T get(Errors errors, InternalContext context, Dependency<?> dependency)
           throws ErrorsException {
-        return targetBinding.internalFactory.get(errors.withSource(targetKey), context, dependency);
+        return targetBinding.getInternalFactory().get(
+            errors.withSource(targetKey), context, dependency);
       }
     };
 
@@ -531,10 +546,9 @@
         this,
         key,
         rawType /* source */,
-        Scopes.<T>scope(key, this, internalFactory, scope),
-        scope,
-        targetKey,
-        loadStrategy);
+        Scopes.<T>scope(key, this, internalFactory, scoping),
+        scoping,
+        targetKey);
   }
 
   /**
@@ -585,7 +599,7 @@
       // createProviderBinding() will return BindingImpl<Provider<X>>.
       @SuppressWarnings("unchecked")
       BindingImpl<T> binding
-          = (BindingImpl<T>) createProviderBinding((Key) key, LoadStrategy.LAZY, errors);
+          = (BindingImpl<T>) createProviderBinding((Key) key, errors);
       return binding;
     }
 
@@ -610,15 +624,14 @@
     }
 
     Object source = key.getTypeLiteral().getRawType();
-    BindingImpl<T> binding = createUnitializedBinding(key, null /* scope */, source,
-        LoadStrategy.LAZY, errors);
+    BindingImpl<T> binding = createUnitializedBinding(key, Scoping.UNSCOPED, source, errors);
     initializeBinding(binding, errors);
     return binding;
   }
 
   <T> InternalFactory<? extends T> getInternalFactory(Key<T> key, Errors errors)
       throws ErrorsException {
-    return getBindingOrThrow(key, errors).internalFactory;
+    return getBindingOrThrow(key, errors).getInternalFactory();
   }
 
   /** Cached field and method injectors for a type. */
@@ -654,6 +667,7 @@
             : new SingleMethodInjector(this, injectionPoint, errorsForMember);
         injectors.add(injector);
       } catch (ErrorsException ignoredForNow) {
+        // ignored for now
       }
     }
     return ImmutableList.copyOf(injectors);
@@ -676,10 +690,10 @@
       multimap.put(type, binding);
     }
 
-    // safe because we only put matching entries into the map
-    @SuppressWarnings("unchecked")
+
+    @SuppressWarnings("unchecked") // safe because we only put matching entries into the map
     <T> List<Binding<T>> getAll(TypeLiteral<T> type) {
-      return (List<Binding<T>>) (List) multimap.get(type);
+      return Collections.<Binding<T>>unmodifiableList((List) multimap.get(type));
     }
   }
 
diff --git a/src/com/google/inject/InjectorShell.java b/src/com/google/inject/InjectorShell.java
index 844fe7c..b03bcab 100644
--- a/src/com/google/inject/InjectorShell.java
+++ b/src/com/google/inject/InjectorShell.java
@@ -23,6 +23,10 @@
 import static com.google.inject.Scopes.SINGLETON;
 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.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;
@@ -181,7 +185,7 @@
     InjectorFactory injectorFactory = new InjectorFactory(injector);
     injector.state.putBinding(key,
         new ProviderInstanceBindingImpl<Injector>(injector, key, SourceProvider.UNKNOWN_SOURCE,
-            injectorFactory, Scopes.NO_SCOPE, injectorFactory, LoadStrategy.LAZY,
+            injectorFactory, Scoping.UNSCOPED, injectorFactory,
             ImmutableSet.<InjectionPoint>of()));
   }
 
@@ -215,8 +219,8 @@
     LoggerFactory loggerFactory = new LoggerFactory();
     injector.state.putBinding(key,
         new ProviderInstanceBindingImpl<Logger>(injector, key,
-            SourceProvider.UNKNOWN_SOURCE, loggerFactory, Scopes.NO_SCOPE,
-            loggerFactory, LoadStrategy.LAZY, ImmutableSet.<InjectionPoint>of()));
+            SourceProvider.UNKNOWN_SOURCE, loggerFactory, Scoping.UNSCOPED,
+            loggerFactory, ImmutableSet.<InjectionPoint>of()));
   }
 
   private static class LoggerFactory implements InternalFactory<Logger>, Provider<Logger> {
diff --git a/src/com/google/inject/InstanceBindingImpl.java b/src/com/google/inject/InstanceBindingImpl.java
deleted file mode 100644
index 0588896..0000000
--- a/src/com/google/inject/InstanceBindingImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright (C) 2008 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package com.google.inject;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingTargetVisitor;
-import com.google.inject.spi.InjectionPoint;
-import com.google.inject.util.Providers;
-import java.util.Set;
-
-class InstanceBindingImpl<T> extends BindingImpl<T> {
-
-  final T instance;
-  final Provider<T> provider;
-  final ImmutableSet<InjectionPoint> injectionPoints;
-
-  InstanceBindingImpl(InjectorImpl injector, Key<T> key, Object source,
-      InternalFactory<? extends T> internalFactory, Set<InjectionPoint> injectionPoints,
-      T instance) {
-    super(injector, key, source, internalFactory, Scopes.NO_SCOPE, LoadStrategy.EAGER);
-    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
-    this.instance = instance;
-    this.provider = Providers.of(instance);
-  }
-
-  @Override public Provider<T> getProvider() {
-    return this.provider;
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return visitor.visitInstance(instance, injectionPoints);
-  }
-
-  @Override public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("instance", instance)
-        .add("source", source)
-        .toString();
-  }
-}
diff --git a/src/com/google/inject/InternalFactoryToProviderAdapter.java b/src/com/google/inject/InternalFactoryToProviderAdapter.java
index a218c1a..62b9ba2 100644
--- a/src/com/google/inject/InternalFactoryToProviderAdapter.java
+++ b/src/com/google/inject/InternalFactoryToProviderAdapter.java
@@ -19,6 +19,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 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.SourceProvider;
 import com.google.inject.spi.Dependency;
 
diff --git a/src/com/google/inject/InvalidBindingImpl.java b/src/com/google/inject/InvalidBindingImpl.java
deleted file mode 100644
index b98c4ee..0000000
--- a/src/com/google/inject/InvalidBindingImpl.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2007 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject;
-
-import com.google.inject.internal.Errors;
-import com.google.inject.spi.BindingTargetVisitor;
-import com.google.inject.spi.Dependency;
-
-class InvalidBindingImpl<T> extends BindingImpl<T> {
-
-  InvalidBindingImpl(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();
-      }
-    }, Scopes.NO_SCOPE, LoadStrategy.LAZY);
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> vVisitor) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override public String toString() {
-    return "InvalidBinding";
-  }
-}
diff --git a/src/com/google/inject/Key.java b/src/com/google/inject/Key.java
index 359ff15..ddcd7d6 100644
--- a/src/com/google/inject/Key.java
+++ b/src/com/google/inject/Key.java
@@ -524,8 +524,7 @@
     private static final long serialVersionUID = 0;
   }
 
-  /** @since 2.0 */
-  protected final void readObject(ObjectInputStream stream) throws InvalidObjectException {
+  private void readObject(ObjectInputStream stream) throws InvalidObjectException {
     throw new InvalidObjectException("Use SerializedForm");
   }
 
diff --git a/src/com/google/inject/LinkedBindingImpl.java b/src/com/google/inject/LinkedBindingImpl.java
deleted file mode 100644
index 5737b90..0000000
--- a/src/com/google/inject/LinkedBindingImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2007 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject;
-
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingTargetVisitor;
-
-/**
- *
- *
- */
-class LinkedBindingImpl<T> extends BindingImpl<T> {
-
-  final Key<? extends T> targetKey;
-
-  LinkedBindingImpl(InjectorImpl injector, Key<T> key, Object source,
-      InternalFactory<? extends T> internalFactory, Scope scope,
-      Key<? extends T> targetKey,
-      LoadStrategy loadStrategy) {
-    super(injector, key, source, internalFactory, scope, loadStrategy);
-    this.targetKey = targetKey;
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return visitor.visitKey(targetKey);
-  }
-
-  @Override public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("target", targetKey)
-        .add("scope", scope)
-        .add("source", source)
-        .toString();
-  }
-}
diff --git a/src/com/google/inject/LinkedProviderBindingImpl.java b/src/com/google/inject/LinkedProviderBindingImpl.java
deleted file mode 100644
index 9132e05..0000000
--- a/src/com/google/inject/LinkedProviderBindingImpl.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2007 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject;
-
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingTargetVisitor;
-
-/**
- *
- *
- */
-class LinkedProviderBindingImpl<T> extends BindingImpl<T> {
-
-  final Key<? extends Provider<? extends T>> providerKey;
-
-  LinkedProviderBindingImpl(InjectorImpl injector, Key<T> key, Object source,
-      InternalFactory<? extends T> internalFactory, Scope scope,
-      Key<? extends Provider<? extends T>> providerKey,
-      LoadStrategy loadStrategy) {
-    super(injector, key, source, internalFactory, scope, loadStrategy);
-    this.providerKey = providerKey;
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return visitor.visitProviderKey(providerKey);
-  }
-
-  @Override public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("provider", providerKey)
-        .add("scope", scope)
-        .add("source", source)
-        .toString();
-  }
-}
diff --git a/src/com/google/inject/ProviderInstanceBindingImpl.java b/src/com/google/inject/ProviderInstanceBindingImpl.java
deleted file mode 100644
index 977d3d3..0000000
--- a/src/com/google/inject/ProviderInstanceBindingImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Copyright (C) 2007 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package com.google.inject;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.internal.ToStringBuilder;
-import com.google.inject.spi.BindingTargetVisitor;
-import com.google.inject.spi.InjectionPoint;
-import java.util.Set;
-
-/**
- *
- */
-class ProviderInstanceBindingImpl<T> extends BindingImpl<T> {
-
-  final Provider<? extends T> providerInstance;
-  final ImmutableSet<InjectionPoint> injectionPoints;
-
-  ProviderInstanceBindingImpl(InjectorImpl injector, Key<T> key,
-      Object source,
-      InternalFactory<? extends T> internalFactory, Scope scope,
-      Provider<? extends T> providerInstance,
-      LoadStrategy loadStrategy,
-      Set<InjectionPoint> injectionPoints) {
-    super(injector, key, source, internalFactory, scope, loadStrategy);
-    this.providerInstance = providerInstance;
-    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return visitor.visitProvider(providerInstance, injectionPoints);
-  }
-
-  @Override
-  public String toString() {
-    return new ToStringBuilder(Binding.class)
-        .add("key", key)
-        .add("provider", providerInstance)
-        .add("scope", scope)
-        .add("source", source)
-        .toString();
-  }
-}
diff --git a/src/com/google/inject/ProviderToInternalFactoryAdapter.java b/src/com/google/inject/ProviderToInternalFactoryAdapter.java
index efad08f..8c5a2eb 100644
--- a/src/com/google/inject/ProviderToInternalFactoryAdapter.java
+++ b/src/com/google/inject/ProviderToInternalFactoryAdapter.java
@@ -18,6 +18,8 @@
 
 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;
 
 /**
diff --git a/src/com/google/inject/Scopes.java b/src/com/google/inject/Scopes.java
index c29ed1d..80dc079 100644
--- a/src/com/google/inject/Scopes.java
+++ b/src/com/google/inject/Scopes.java
@@ -16,8 +16,13 @@
 
 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;
+
 /**
- * Built in scope implementations.
+ * Built-in scope implementations.
  *
  * @author crazybob@google.com (Bob Lee)
  */
@@ -86,16 +91,38 @@
   };
 
   /** Scopes an internal factory. */
-  static <T> InternalFactory<? extends T> scope(Key<T> key,
-      InjectorImpl injector, InternalFactory<? extends T> creator,
-      Scope scope) {
-    // No scope does nothing.
-    if (scope == null || scope == Scopes.NO_SCOPE) {
+  static <T> InternalFactory<? extends T> scope(Key<T> key, InjectorImpl injector,
+      InternalFactory<? extends T> creator, Scoping scoping) {
+
+    if (scoping.isNoScope()) {
       return creator;
     }
-    Provider<T> scoped = scope.scope(key,
-        new ProviderToInternalFactoryAdapter<T>(injector, 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/SingleFieldInjector.java b/src/com/google/inject/SingleFieldInjector.java
index cff31fb..76ca8b2 100644
--- a/src/com/google/inject/SingleFieldInjector.java
+++ b/src/com/google/inject/SingleFieldInjector.java
@@ -18,6 +18,8 @@
 
 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;
diff --git a/src/com/google/inject/SingleMemberInjector.java b/src/com/google/inject/SingleMemberInjector.java
index a69cc85..6401162 100644
--- a/src/com/google/inject/SingleMemberInjector.java
+++ b/src/com/google/inject/SingleMemberInjector.java
@@ -17,6 +17,7 @@
 package com.google.inject;
 
 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/SingleMethodInjector.java
index 5bde8fe..6885866 100644
--- a/src/com/google/inject/SingleMethodInjector.java
+++ b/src/com/google/inject/SingleMethodInjector.java
@@ -22,6 +22,7 @@
 import static com.google.inject.internal.BytecodeGen.newFastClass;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.ErrorsException;
+import com.google.inject.internal.InternalContext;
 import com.google.inject.spi.InjectionPoint;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
diff --git a/src/com/google/inject/SingleParameterInjector.java b/src/com/google/inject/SingleParameterInjector.java
index 954b530..17bb25b 100644
--- a/src/com/google/inject/SingleParameterInjector.java
+++ b/src/com/google/inject/SingleParameterInjector.java
@@ -18,6 +18,8 @@
 
 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 java.util.List;
 
diff --git a/src/com/google/inject/State.java b/src/com/google/inject/State.java
index 23ea08e..e9759ac 100644
--- a/src/com/google/inject/State.java
+++ b/src/com/google/inject/State.java
@@ -18,6 +18,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.internal.BindingImpl;
 import com.google.inject.internal.Errors;
 import com.google.inject.internal.MatcherAndConverter;
 import java.lang.annotation.Annotation;
diff --git a/src/com/google/inject/internal/AbstractBindingBuilder.java b/src/com/google/inject/internal/AbstractBindingBuilder.java
new file mode 100644
index 0000000..6575229
--- /dev/null
+++ b/src/com/google/inject/internal/AbstractBindingBuilder.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.inject.Binder;
+import com.google.inject.Key;
+import com.google.inject.Scope;
+import com.google.inject.spi.Element;
+import com.google.inject.spi.InstanceBinding;
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+/**
+ * Bind a value or constant.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ */
+public abstract class AbstractBindingBuilder<T> {
+
+  public static final String IMPLEMENTATION_ALREADY_SET = "Implementation is set more than once.";
+  public static final String SINGLE_INSTANCE_AND_SCOPE
+      = "Setting the scope is not permitted when binding to a single instance.";
+  public static final String SCOPE_ALREADY_SET = "Scope is set more than once.";
+  public static final String BINDING_TO_NULL = "Binding to null instances is not allowed. "
+      + "Use toProvider(Providers.of(null)) if this is your intended behaviour.";
+  public static final String CONSTANT_VALUE_ALREADY_SET = "Constant value is set more than once.";
+  public static final String ANNOTATION_ALREADY_SPECIFIED
+      = "More than one annotation is specified for this binding.";
+
+  protected static final Key<?> NULL_KEY = Key.get(Void.class);
+
+  protected List<Element> elements;
+  protected int position;
+  protected final Binder binder;
+  private BindingImpl<T> binding;
+
+  public AbstractBindingBuilder(Binder binder, List<Element> elements, Object source, Key<T> key) {
+    this.binder = binder;
+    this.elements = elements;
+    this.position = elements.size();
+    this.binding = new UntargettedBindingImpl<T>(source, key, Scoping.UNSCOPED);
+    elements.add(position, this.binding);
+  }
+
+  protected BindingImpl<T> getBinding() {
+    return binding;
+  }
+
+  protected BindingImpl<T> setBinding(BindingImpl<T> binding) {
+    this.binding = binding;
+    elements.set(position, binding);
+    return binding;
+  }
+
+  /** Sets the binding to a copy with the specified annotation on the bound key */
+  protected BindingImpl<T> annotatedWithInternal(Class<? extends Annotation> annotationType) {
+    checkNotNull(annotationType, "annotationType");
+    checkNotAnnotated();
+    return setBinding(binding.withKey(
+        Key.get(this.binding.getKey().getTypeLiteral(), annotationType)));
+  }
+
+  /** Sets the binding to a copy with the specified annotation on the bound key */
+  protected BindingImpl<T> annotatedWithInternal(Annotation annotation) {
+    checkNotNull(annotation, "annotation");
+    checkNotAnnotated();
+    return setBinding(binding.withKey(
+        Key.get(this.binding.getKey().getTypeLiteral(), annotation)));
+  }
+
+  public void in(final Class<? extends Annotation> scopeAnnotation) {
+    checkNotNull(scopeAnnotation, "scopeAnnotation");
+    checkNotScoped();
+    setBinding(getBinding().withScoping(Scoping.forAnnotation(scopeAnnotation)));
+  }
+
+  public void in(final Scope scope) {
+    checkNotNull(scope, "scope");
+    checkNotScoped();
+    setBinding(getBinding().withScoping(Scoping.forInstance(scope)));
+  }
+
+  public void asEagerSingleton() {
+    checkNotScoped();
+    setBinding(getBinding().withScoping(Scoping.EAGER_SINGLETON));
+  }
+
+  protected boolean keyTypeIsSet() {
+    return !Void.class.equals(binding.getKey().getTypeLiteral().getType());
+  }
+
+  protected void checkNotTargetted() {
+    if (!(binding instanceof UntargettedBindingImpl)) {
+      binder.addError(IMPLEMENTATION_ALREADY_SET);
+    }
+  }
+
+  protected void checkNotAnnotated() {
+    if (binding.getKey().getAnnotationType() != null) {
+      binder.addError(ANNOTATION_ALREADY_SPECIFIED);
+    }
+  }
+
+  protected void checkNotScoped() {
+    // Scoping isn't allowed when we have only one instance.
+    if (binding instanceof InstanceBinding) {
+      binder.addError(SINGLE_INSTANCE_AND_SCOPE);
+      return;
+    }
+
+    if (binding.getScoping().isExplicitlyScoped()) {
+      binder.addError(SCOPE_ALREADY_SET);
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/com/google/inject/internal/BindingBuilder.java b/src/com/google/inject/internal/BindingBuilder.java
new file mode 100644
index 0000000..5f65855
--- /dev/null
+++ b/src/com/google/inject/internal/BindingBuilder.java
@@ -0,0 +1,178 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Binder;
+import com.google.inject.ConfigurationException;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.binder.AnnotatedBindingBuilder;
+import com.google.inject.binder.AnnotatedElementBuilder;
+import com.google.inject.spi.Element;
+import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.Message;
+import com.google.inject.spi.PrivateEnvironment;
+import java.lang.annotation.Annotation;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Bind a non-constant key.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ */
+public class BindingBuilder<T> extends AbstractBindingBuilder<T>
+    implements AnnotatedBindingBuilder<T> {
+
+  public BindingBuilder(Binder binder, List<Element> elements, Object source, Key<T> key) {
+    super(binder, elements, source, key);
+  }
+
+  public BindingBuilder<T> annotatedWith(Class<? extends Annotation> annotationType) {
+    annotatedWithInternal(annotationType);
+    return this;
+  }
+
+  public BindingBuilder<T> annotatedWith(Annotation annotation) {
+    annotatedWithInternal(annotation);
+    return this;
+  }
+
+  public BindingBuilder<T> to(Class<? extends T> implementation) {
+    return to(Key.get(implementation));
+  }
+
+  public BindingBuilder<T> to(TypeLiteral<? extends T> implementation) {
+    return to(Key.get(implementation));
+  }
+
+  public BindingBuilder<T> to(Key<? extends T> linkedKey) {
+    checkNotNull(linkedKey, "linkedKey");
+    checkNotTargetted();
+    BindingImpl<T> base = getBinding();
+    setBinding(new LinkedBindingImpl<T>(
+        base.getSource(), base.getKey(), base.getScoping(), linkedKey));
+    return this;
+  }
+
+  public void toInstance(T instance) {
+    checkNotTargetted();
+
+    // lookup the injection points, adding any errors to the binder's errors list
+    Set<InjectionPoint> injectionPoints;
+    if (instance != null) {
+      try {
+        injectionPoints = InjectionPoint.forInstanceMethodsAndFields(instance.getClass());
+      } catch (ConfigurationException e) {
+        for (Message message : e.getErrorMessages()) {
+          binder.addError(message);
+        }
+        injectionPoints = e.getPartialValue();
+      }
+    } else {
+      binder.addError(BINDING_TO_NULL);
+      injectionPoints = ImmutableSet.of();
+    }
+
+    BindingImpl<T> base = getBinding();
+    setBinding(new InstanceBindingImpl<T>(
+        base.getSource(), base.getKey(), base.getScoping(), injectionPoints, instance));
+  }
+
+  public BindingBuilder<T> toProvider(Provider<? extends T> provider) {
+    checkNotNull(provider, "provider");
+    checkNotTargetted();
+
+    // lookup the injection points, adding any errors to the binder's errors list
+    Set<InjectionPoint> injectionPoints;
+    try {
+      injectionPoints = InjectionPoint.forInstanceMethodsAndFields(provider.getClass());
+    } catch (ConfigurationException e) {
+      for (Message message : e.getErrorMessages()) {
+        binder.addError(message);
+      }
+      injectionPoints = e.getPartialValue();
+    }
+
+    BindingImpl<T> base = getBinding();
+    setBinding(new ProviderInstanceBindingImpl<T>(
+        base.getSource(), base.getKey(), base.getScoping(), injectionPoints, provider));
+    return this;
+  }
+
+  public BindingBuilder<T> toProvider(Class<? extends Provider<? extends T>> providerType) {
+    return toProvider(Key.get(providerType));
+  }
+
+  public BindingBuilder<T> toProvider(Key<? extends Provider<? extends T>> providerKey) {
+    checkNotNull(providerKey, "providerKey");
+    checkNotTargetted();
+
+    BindingImpl<T> base = getBinding();
+    setBinding(new LinkedProviderBindingImpl<T>(
+        base.getSource(), base.getKey(), base.getScoping(), providerKey));
+    return this;
+  }
+
+  public ExposureBuilder<T> usingKeyFrom(PrivateEnvironment privateEnvironment) {
+    checkNotTargetted();
+    checkNotScoped();
+
+    BindingImpl<T> base = getBinding();
+    ExposedBindingImpl<T> exposedBinding = new ExposedBindingImpl<T>(
+        base.getSource(), base.getKey(), base.getScoping(), privateEnvironment);
+    setBinding(exposedBinding);
+
+    return new ExposureBuilder<T>(this, exposedBinding);
+  }
+
+  @Override public String toString() {
+    return "BindingBuilder<" + getBinding().getKey().getTypeLiteral() + ">";
+  }
+
+  /**
+   * For private binder's expose() method.
+   */
+  public static class ExposureBuilder<T> implements AnnotatedElementBuilder {
+    private final BindingBuilder<T> bindingBuilder;
+    private BindingImpl<T> binding;
+
+    public ExposureBuilder(BindingBuilder<T> bindingBuilder, ExposedBindingImpl<T> binding) {
+      this.binding = binding;
+      this.bindingBuilder = bindingBuilder;
+    }
+
+    public void annotatedWith(Class<? extends Annotation> annotationType) {
+      binding = bindingBuilder.annotatedWithInternal(annotationType);
+    }
+
+    public void annotatedWith(Annotation annotation) {
+      binding = bindingBuilder.annotatedWithInternal(annotation);
+    }
+
+    public Key<?> getKey() {
+      return binding.getKey();
+    }
+
+    @Override public String toString() {
+      return "AnnotatedElementBuilder";
+    }
+  }
+}
diff --git a/src/com/google/inject/internal/BindingImpl.java b/src/com/google/inject/internal/BindingImpl.java
new file mode 100644
index 0000000..625b9ee
--- /dev/null
+++ b/src/com/google/inject/internal/BindingImpl.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (C) 2006 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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;
+import com.google.inject.spi.ElementVisitor;
+import com.google.inject.spi.InstanceBinding;
+
+/**
+ * @author crazybob@google.com (Bob Lee)
+ */
+public abstract class BindingImpl<T> implements Binding<T> {
+
+  private final Injector 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,
+      InternalFactory<? extends T> internalFactory, Scoping scoping) {
+    this.injector = injector;
+    this.key = key;
+    this.source = source;
+    this.internalFactory = internalFactory;
+    this.scoping = scoping;
+  }
+
+  protected BindingImpl(Object source, Key<T> key, Scoping scoping) {
+    this.internalFactory = null;
+    this.injector = null;
+    this.source = source;
+    this.key = key;
+    this.scoping = scoping;
+  }
+
+  public Key<T> getKey() {
+    return key;
+  }
+
+  public Object getSource() {
+    return source;
+  }
+
+  private volatile Provider<T> provider;
+
+  public Provider<T> getProvider() {
+    if (provider == null) {
+      if (injector == null) {
+        throw new UnsupportedOperationException("getProvider() not supported for module bindings");
+      }
+
+      provider = injector.getProvider(key);
+    }
+    return provider;
+  }
+
+  public InternalFactory<? extends T> getInternalFactory() {
+    return internalFactory;
+  }
+
+  public Scoping getScoping() {
+    return scoping;
+  }
+
+  /**
+   * Is this a constant binding? This returns true for constant bindings as
+   * well as toInstance() bindings.
+   */
+  public boolean isConstant() {
+    return this instanceof InstanceBinding;
+  }
+
+  public <V> V acceptVisitor(ElementVisitor<V> visitor) {
+    return visitor.visitBinding(this);
+  }
+
+  public <V> V acceptScopingVisitor(BindingScopingVisitor<V> visitor) {
+    return scoping.acceptVisitor(visitor);
+  }
+
+  /**
+   * Perform any post-creation initialization, that could require construction of other bindings.
+   */
+  public void initialize(Injector injector, Errors errors) throws ErrorsException {}
+
+  protected BindingImpl<T> withScoping(Scoping scoping) {
+    throw new AssertionError();
+  }
+
+  protected BindingImpl<T> withKey(Key<T> key) {
+    throw new AssertionError();
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(Binding.class)
+        .add("key", key)
+        .add("scope", scoping)
+        .add("source", source)
+        .toString();
+  }
+
+  public Injector getInjector() {
+    return injector;
+  }
+}
\ No newline at end of file
diff --git a/src/com/google/inject/internal/ConstantBindingBuilderImpl.java b/src/com/google/inject/internal/ConstantBindingBuilderImpl.java
new file mode 100644
index 0000000..ca0fcb6
--- /dev/null
+++ b/src/com/google/inject/internal/ConstantBindingBuilderImpl.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Binder;
+import com.google.inject.Key;
+import com.google.inject.binder.AnnotatedConstantBindingBuilder;
+import com.google.inject.binder.ConstantBindingBuilder;
+import com.google.inject.spi.Element;
+import com.google.inject.spi.InjectionPoint;
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+/**
+ * Bind a constant.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ */
+public final class ConstantBindingBuilderImpl<T>
+    extends AbstractBindingBuilder<T>
+    implements AnnotatedConstantBindingBuilder, ConstantBindingBuilder {
+
+  @SuppressWarnings("unchecked") // constant bindings start out with T unknown
+  public ConstantBindingBuilderImpl(Binder binder, List<Element> elements, Object source) {
+    super(binder, elements, source, (Key<T>) NULL_KEY);
+  }
+
+  public ConstantBindingBuilder annotatedWith(Class<? extends Annotation> annotationType) {
+    annotatedWithInternal(annotationType);
+    return this;
+  }
+
+  public ConstantBindingBuilder annotatedWith(Annotation annotation) {
+    annotatedWithInternal(annotation);
+    return this;
+  }
+
+  public void to(final String value) {
+    toConstant(String.class, value);
+  }
+
+  public void to(final int value) {
+    toConstant(Integer.class, value);
+  }
+
+  public void to(final long value) {
+    toConstant(Long.class, value);
+  }
+
+  public void to(final boolean value) {
+    toConstant(Boolean.class, value);
+  }
+
+  public void to(final double value) {
+    toConstant(Double.class, value);
+  }
+
+  public void to(final float value) {
+    toConstant(Float.class, value);
+  }
+
+  public void to(final short value) {
+    toConstant(Short.class, value);
+  }
+
+  public void to(final char value) {
+    toConstant(Character.class, value);
+  }
+
+  public void to(final Class<?> value) {
+    toConstant(Class.class, value);
+  }
+
+  public <E extends Enum<E>> void to(final E value) {
+    toConstant(value.getDeclaringClass(), value);
+  }
+
+  private void toConstant(Class<?> type, Object instance) {
+    // this type will define T, so these assignments are safe
+    @SuppressWarnings("unchecked")
+    Class<T> typeAsClassT = (Class<T>) type;
+    @SuppressWarnings("unchecked")
+    T instanceAsT = (T) instance;
+
+    if (keyTypeIsSet()) {
+      binder.addError(CONSTANT_VALUE_ALREADY_SET);
+      return;
+    }
+
+    BindingImpl<T> base = getBinding();
+    Key<T> key;
+    if (base.getKey().getAnnotation() != null) {
+      key = Key.get(typeAsClassT, base.getKey().getAnnotation());
+    } else if (base.getKey().getAnnotationType() != null) {
+      key = Key.get(typeAsClassT, base.getKey().getAnnotationType());
+    } else {
+      key = Key.get(typeAsClassT);
+    }
+
+    if (instanceAsT == null) {
+      binder.addError(BINDING_TO_NULL);
+    }
+
+    setBinding(new InstanceBindingImpl<T>(
+        base.getSource(), key, base.getScoping(), ImmutableSet.<InjectionPoint>of(), instanceAsT));
+  }
+
+  @Override public String toString() {
+    return "ConstantBindingBuilder";
+  }
+}
\ No newline at end of file
diff --git a/src/com/google/inject/ConstructionContext.java b/src/com/google/inject/internal/ConstructionContext.java
similarity index 86%
rename from src/com/google/inject/ConstructionContext.java
rename to src/com/google/inject/internal/ConstructionContext.java
index bbcb335..6764fb4 100644
--- a/src/com/google/inject/ConstructionContext.java
+++ b/src/com/google/inject/internal/ConstructionContext.java
@@ -14,11 +14,8 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
-import com.google.inject.internal.BytecodeGen;
-import com.google.inject.internal.Errors;
-import com.google.inject.internal.ErrorsException;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -31,39 +28,39 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class ConstructionContext<T> {
+public class ConstructionContext<T> {
 
   T currentReference;
   boolean constructing;
 
   List<DelegatingInvocationHandler<T>> invocationHandlers;
 
-  T getCurrentReference() {
+  public T getCurrentReference() {
     return currentReference;
   }
 
-  void removeCurrentReference() {
+  public void removeCurrentReference() {
     this.currentReference = null;
   }
 
-  void setCurrentReference(T currentReference) {
+  public void setCurrentReference(T currentReference) {
     this.currentReference = currentReference;
   }
 
-  boolean isConstructing() {
+  public boolean isConstructing() {
     return constructing;
   }
 
-  void startConstruction() {
+  public void startConstruction() {
     this.constructing = true;
   }
 
-  void finishConstruction() {
+  public void finishConstruction() {
     this.constructing = false;
     invocationHandlers = null;
   }
 
-  Object createProxy(Errors errors, Class<?> expectedType) throws ErrorsException {
+  public Object createProxy(Errors errors, Class<?> expectedType) throws ErrorsException {
     // TODO: if I create a proxy which implements all the interfaces of
     // the implementation type, I'll be able to get away with one proxy
     // instance (as opposed to one per caller).
@@ -85,7 +82,7 @@
         new Class[] { expectedType }, invocationHandler));
   }
 
-  void setProxyDelegates(T delegate) {
+  public void setProxyDelegates(T delegate) {
     if (invocationHandlers != null) {
       for (DelegatingInvocationHandler<T> handler : invocationHandlers) {
         handler.setDelegate(delegate);
diff --git a/src/com/google/inject/internal/ExposedBindingImpl.java b/src/com/google/inject/internal/ExposedBindingImpl.java
new file mode 100644
index 0000000..0e89171
--- /dev/null
+++ b/src/com/google/inject/internal/ExposedBindingImpl.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.spi.BindingTargetVisitor;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.ExposedBinding;
+import com.google.inject.spi.PrivateEnvironment;
+import java.util.Set;
+
+public class ExposedBindingImpl<T> extends BindingImpl<T> implements ExposedBinding<T> {
+
+  private final PrivateEnvironment privateEnvironment;
+
+  public ExposedBindingImpl(Injector injector, Object source, Key<T> key,
+      InternalFactory<T> factory, PrivateEnvironment privateEnvironment) {
+    super(injector, key, source, factory, Scoping.UNSCOPED);
+    this.privateEnvironment = privateEnvironment;
+  }
+
+  public ExposedBindingImpl(Object source, Key<T> key, Scoping scoping,
+      PrivateEnvironment privateEnvironment) {
+    super(source, key, scoping);
+    this.privateEnvironment = privateEnvironment;
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitExposed(this);
+  }
+
+  public Set<Dependency<?>> getDependencies() {
+    return ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Injector.class)));
+  }
+
+  public PrivateEnvironment getPrivateEnvironment() {
+    return privateEnvironment;
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new ExposedBindingImpl<T>(getSource(), getKey(), scoping, privateEnvironment);
+  }
+
+  public ExposedBindingImpl<T> withKey(Key<T> key) {
+    return new ExposedBindingImpl<T>(getSource(), key, getScoping(), privateEnvironment);
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(ExposedBinding.class)
+        .add("key", getKey())
+        .add("privateEnvironment", privateEnvironment)
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/internal/InstanceBindingImpl.java b/src/com/google/inject/internal/InstanceBindingImpl.java
new file mode 100644
index 0000000..f8d8f3b
--- /dev/null
+++ b/src/com/google/inject/internal/InstanceBindingImpl.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.spi.BindingTargetVisitor;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
+import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.InstanceBinding;
+import com.google.inject.util.Providers;
+import java.util.Set;
+
+public 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,
+      InternalFactory<? extends T> internalFactory, Set<InjectionPoint> injectionPoints,
+      T instance) {
+    super(injector, key, source, internalFactory, Scoping.UNSCOPED);
+    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
+    this.instance = instance;
+    this.provider = Providers.of(instance);
+  }
+
+  public InstanceBindingImpl(Object source, Key<T> key, Scoping scoping,
+      Set<InjectionPoint> injectionPoints, T instance) {
+    super(source, key, scoping);
+    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
+    this.instance = instance;
+    this.provider = Providers.of(instance);
+  }
+
+  @Override public Provider<T> getProvider() {
+    return this.provider;
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitInstance(this);
+  }
+
+  public T getInstance() {
+    return instance;
+  }
+
+  public Set<InjectionPoint> getInjectionPoints() {
+    return injectionPoints;
+  }
+
+  public Set<Dependency<?>> getDependencies() {
+    return instance instanceof HasDependencies
+        ? ImmutableSet.copyOf(((HasDependencies) instance).getDependencies())
+        : Dependency.forInjectionPoints(injectionPoints);
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new InstanceBindingImpl<T>(getSource(), getKey(), scoping, injectionPoints, instance);
+  }
+
+  public BindingImpl<T> withKey(Key<T> key) {
+    return new InstanceBindingImpl<T>(getSource(), key, getScoping(), injectionPoints, instance);
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(InstanceBinding.class)
+        .add("key", getKey())
+        .add("instance", instance)
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/InternalContext.java b/src/com/google/inject/internal/InternalContext.java
similarity index 95%
rename from src/com/google/inject/InternalContext.java
rename to src/com/google/inject/internal/InternalContext.java
index 4183d0b..3cb6912 100644
--- a/src/com/google/inject/InternalContext.java
+++ b/src/com/google/inject/internal/InternalContext.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.google.inject;
+package com.google.inject.internal;
 
 import com.google.inject.spi.Dependency;
 import java.util.HashMap;
@@ -26,7 +26,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-class InternalContext {
+public final class InternalContext {
 
   private Map<Object, ConstructionContext<?>> constructionContexts;
   private Dependency dependency;
diff --git a/src/com/google/inject/InternalFactory.java b/src/com/google/inject/internal/InternalFactory.java
similarity index 87%
rename from src/com/google/inject/InternalFactory.java
rename to src/com/google/inject/internal/InternalFactory.java
index b2f36a8..ea3f33a 100644
--- a/src/com/google/inject/InternalFactory.java
+++ b/src/com/google/inject/internal/InternalFactory.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.ErrorsException;
 import com.google.inject.spi.Dependency;
 
 /**
@@ -25,7 +23,7 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-interface InternalFactory<T> {
+public interface InternalFactory<T> {
 
   /**
    * Creates an object to be injected.
diff --git a/src/com/google/inject/internal/LinkedBindingImpl.java b/src/com/google/inject/internal/LinkedBindingImpl.java
new file mode 100644
index 0000000..2b721e2
--- /dev/null
+++ b/src/com/google/inject/internal/LinkedBindingImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2007 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.inject.Injector;
+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 Key<? extends T> targetKey;
+
+  public LinkedBindingImpl(Injector injector, Key<T> key, Object source,
+      InternalFactory<? extends T> internalFactory, Scoping scoping,
+      Key<? extends T> targetKey) {
+    super(injector, key, source, internalFactory, scoping);
+    this.targetKey = targetKey;
+  }
+
+  public LinkedBindingImpl(Object source, Key<T> key, Scoping scoping, Key<? extends T> targetKey) {
+    super(source, key, scoping);
+    this.targetKey = targetKey;
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitLinkedKey(this);
+  }
+
+  public Key<? extends T> getLinkedKey() {
+    return targetKey;
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new LinkedBindingImpl<T>(getSource(), getKey(), scoping, targetKey);
+  }
+
+  public BindingImpl<T> withKey(Key<T> key) {
+    return new LinkedBindingImpl<T>(getSource(), key, getScoping(), targetKey);
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(LinkedKeyBinding.class)
+        .add("key", getKey())
+        .add("target", targetKey)
+        .add("scope", getScoping())
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/internal/LinkedProviderBindingImpl.java b/src/com/google/inject/internal/LinkedProviderBindingImpl.java
new file mode 100644
index 0000000..13f388f
--- /dev/null
+++ b/src/com/google/inject/internal/LinkedProviderBindingImpl.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2007 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.spi.BindingTargetVisitor;
+import com.google.inject.spi.ProviderKeyBinding;
+
+public 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,
+      InternalFactory<? extends T> internalFactory, Scoping scoping,
+      Key<? extends Provider<? extends T>> providerKey) {
+    super(injector, key, source, internalFactory, scoping);
+    this.providerKey = providerKey;
+  }
+
+  LinkedProviderBindingImpl(Object source, Key<T> key, Scoping scoping,
+      Key<? extends Provider<? extends T>> providerKey) {
+    super(source, key, scoping);
+    this.providerKey = providerKey;
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitProviderKey(this);
+  }
+
+  public Key<? extends Provider<? extends T>> getProviderKey() {
+    return providerKey;
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new LinkedProviderBindingImpl<T>(getSource(), getKey(), scoping, providerKey);
+  }
+
+  public BindingImpl<T> withKey(Key<T> key) {
+    return new LinkedProviderBindingImpl<T>(getSource(), key, getScoping(), providerKey);
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(ProviderKeyBinding.class)
+        .add("key", getKey())
+        .add("provider", providerKey)
+        .add("scope", getScoping())
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/internal/ModuleBinding.java b/src/com/google/inject/internal/ModuleBinding.java
deleted file mode 100644
index 6887359..0000000
--- a/src/com/google/inject/internal/ModuleBinding.java
+++ /dev/null
@@ -1,537 +0,0 @@
-/**
- * Copyright (C) 2008 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.google.inject.internal;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Binder;
-import com.google.inject.Binding;
-import com.google.inject.ConfigurationException;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.Scope;
-import com.google.inject.TypeLiteral;
-import com.google.inject.binder.AnnotatedBindingBuilder;
-import com.google.inject.binder.AnnotatedConstantBindingBuilder;
-import com.google.inject.binder.AnnotatedElementBuilder;
-import com.google.inject.binder.ConstantBindingBuilder;
-import com.google.inject.binder.LinkedBindingBuilder;
-import com.google.inject.binder.ScopedBindingBuilder;
-import com.google.inject.spi.BindingScopingVisitor;
-import com.google.inject.spi.BindingTargetVisitor;
-import com.google.inject.spi.DefaultBindingTargetVisitor;
-import com.google.inject.spi.ElementVisitor;
-import com.google.inject.spi.InjectionPoint;
-import com.google.inject.spi.Message;
-import com.google.inject.spi.PrivateEnvironment;
-import com.google.inject.util.Providers;
-import java.lang.annotation.Annotation;
-import java.util.Set;
-
-/**
- * Immutable snapshot of a request to bind a value.
- *
- * @author jessewilson@google.com (Jesse Wilson)
- */
-public final class ModuleBinding<T> implements Binding<T> {
-
-  public static final String IMPLEMENTATION_ALREADY_SET = "Implementation is set more than once.";
-  public static final String SINGLE_INSTANCE_AND_SCOPE
-      = "Setting the scope is not permitted when binding to a single instance.";
-  public static final String SCOPE_ALREADY_SET = "Scope is set more than once.";
-  public static final String BINDING_TO_NULL = "Binding to null instances is not allowed. "
-      + "Use toProvider(Providers.of(null)) if this is your intended behaviour.";
-  public static final String CONSTANT_VALUE_ALREADY_SET = "Constant value is set more than once.";
-  public static final String ANNOTATION_ALREADY_SPECIFIED
-      = "More than one annotation is specified for this binding.";
-
-  private final Key<?> NULL_KEY = Key.get(Void.class);
-
-  private static final Target<Object> EMPTY_TARGET = new Target<Object>() {
-    public <V> V acceptTargetVisitor(BindingTargetVisitor<? super Object, V> visitor) {
-      return visitor.visitUntargetted();
-    }
-  };
-
-  private static final Scoping EMPTY_SCOPING = new AbstractScoping() {
-    public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
-      return visitor.visitNoScoping();
-    }
-  };
-
-  private static final BindingTargetVisitor<Object, Boolean> SUPPORTS_SCOPES
-      = new DefaultBindingTargetVisitor<Object, Boolean>() {
-    @Override public Boolean visitInstance(Object instance, Set<InjectionPoint> injectionPoints) {
-      return false;
-    }
-
-    @Override protected Boolean visitOther() {
-      return true;
-    }
-  };
-
-  private final Object source;
-  private Key<T> key;
-
-  @SuppressWarnings("unchecked")
-  private Target<T> target = (Target<T>) EMPTY_TARGET;
-  private Scoping scoping = EMPTY_SCOPING;
-
-  public ModuleBinding(Object source, Key<T> key) {
-    this.source = checkNotNull(source, "source");
-    this.key = checkNotNull(key, "key");
-  }
-
-  public ModuleBinding(Object source) {
-    @SuppressWarnings("unchecked") // unsafe, but we won't ever return this (Key.get fails)
-    Key<T> NULL_KEY_OF_T = (Key<T>) NULL_KEY;
-
-    this.source = checkNotNull(source);
-    this.key = NULL_KEY_OF_T;
-  }
-
-  public Object getSource() {
-    return source;
-  }
-
-  /**
-   * Returns the scoped provider guice uses to fulfill requests for this
-   * binding.
-   */
-  public Provider<T> getProvider() {
-    throw new UnsupportedOperationException();
-  }
-
-  public <V> V acceptVisitor(ElementVisitor<V> visitor) {
-    return visitor.visitBinding(this);
-  }
-
-  public Key<T> getKey() {
-    return key;
-  }
-
-  public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-    return target.acceptTargetVisitor(visitor);
-  }
-
-  public <V> V acceptScopingVisitor(BindingScopingVisitor<V> visitor) {
-    return scoping.acceptVisitor(visitor);
-  }
-
-  private boolean keyTypeIsSet() {
-    return !Void.class.equals(key.getTypeLiteral().getType());
-  }
-
-  @Override public String toString() {
-    return "bind " + key
-        + (target == EMPTY_TARGET ? "" : (" to " + target))
-        + (scoping == EMPTY_SCOPING ? "" : (" in " + scoping));
-  }
-
-  private static abstract class AbstractScoping implements Scoping {
-    public Scope getScope() {
-      return null;
-    }
-    public Class<? extends Annotation> getScopeAnnotation() {
-      return null;
-    }
-  }
-
-  public RegularBuilder regularBuilder(Binder binder) {
-    return new RegularBuilder(binder);
-  }
-
-
-  /** @param binder the binder where errors will be reported. */
-  public ExposureBuilder<T> exposedKeyBuilder(Binder binder,
-      final PrivateEnvironment privateEnvironment) {
-    if (target != EMPTY_TARGET) {
-      throw new AssertionError();
-    }
-
-    target = new Target<T>() {
-      public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-        return visitor.visitExposed(privateEnvironment);
-      }
-    };
-
-    return new ExposureBuilder<T>(this, binder);
-  }
-
-  /**
-   * Write access to the internal state of this element. Not for use by the public API.
-   */
-  public class RegularBuilder implements AnnotatedBindingBuilder<T> {
-    private final Binder binder;
-
-    RegularBuilder(Binder binder) {
-      this.binder = binder.skipSources(RegularBuilder.class);
-    }
-
-    public LinkedBindingBuilder<T> annotatedWith(Class<? extends Annotation> annotationType) {
-      checkNotNull(annotationType, "annotationType");
-      checkNotAnnotated();
-      key = Key.get(key.getTypeLiteral(), annotationType);
-      return this;
-    }
-
-    public LinkedBindingBuilder<T> annotatedWith(Annotation annotation) {
-      checkNotNull(annotation, "annotation");
-      checkNotAnnotated();
-      key = Key.get(key.getTypeLiteral(), annotation);
-      return this;
-    }
-
-    public ScopedBindingBuilder to(final Class<? extends T> implementation) {
-      return to(Key.get(implementation));
-    }
-
-    public ScopedBindingBuilder to(
-        final TypeLiteral<? extends T> implementation) {
-      return to(Key.get(implementation));
-    }
-
-    public ScopedBindingBuilder to(final Key<? extends T> targetKey) {
-      checkNotNull(targetKey, "targetKey");
-      checkNotTargetted();
-      target = new Target<T>() {
-        public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-          return visitor.visitKey(targetKey);
-        }
-        @Override public String toString() {
-          return String.valueOf(targetKey);
-        }
-      };
-      return this;
-    }
-
-    public void toInstance(final T instance) {
-      checkNotTargetted();
-
-      if (instance == null) {
-        binder.addError(BINDING_TO_NULL);
-        // we finish the binding to prevent additional errors
-        toProvider(Providers.<T>of(null));
-        return;
-      }
-
-      // lookup the injection points, adding any errors to the binder's errors list
-      Set<InjectionPoint> injectionPoints;
-      try {
-        injectionPoints = InjectionPoint.forInstanceMethodsAndFields(instance.getClass());
-      } catch (ConfigurationException e) {
-        for (Message message : e.getErrorMessages()) {
-          binder.addError(message);
-        }
-        injectionPoints = e.getPartialValue();
-      }
-      target = new InstanceTarget<T>(instance, injectionPoints);
-    }
-
-    public ScopedBindingBuilder toProvider(final Provider<? extends T> provider) {
-      checkNotNull(provider, "provider");
-      checkNotTargetted();
-
-      // lookup the injection points, adding any errors to the binder's errors list
-      Set<InjectionPoint> injectionPoints;
-      try {
-        injectionPoints = InjectionPoint.forInstanceMethodsAndFields(provider.getClass());
-      } catch (ConfigurationException e) {
-        for (Message message : e.getErrorMessages()) {
-          binder.addError(message);
-        }
-        injectionPoints = e.getPartialValue();
-      }
-
-      final Set<InjectionPoint> injectionPointsFinal = injectionPoints;
-      target = new Target<T>() {
-        public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-          return visitor.visitProvider(provider, injectionPointsFinal);
-        }
-      };
-      return this;
-    }
-
-    public ScopedBindingBuilder toProvider(
-        Class<? extends Provider<? extends T>> providerType) {
-      return toProvider(Key.get(providerType));
-    }
-
-    public ScopedBindingBuilder toProvider(
-        final Key<? extends Provider<? extends T>> providerKey) {
-      checkNotNull(providerKey, "providerKey");
-      checkNotTargetted();
-      target = new Target<T>() {
-        public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-          return visitor.visitProviderKey(providerKey);
-        }
-      };
-      return this;
-    }
-
-    public void in(final Class<? extends Annotation> scopeAnnotation) {
-      checkNotNull(scopeAnnotation, "scopeAnnotation");
-      checkNotScoped();
-
-      scoping = new AbstractScoping() {
-        @Override public Class<? extends Annotation> getScopeAnnotation() {
-          return scopeAnnotation;
-        }
-        public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
-          return visitor.visitScopeAnnotation(scopeAnnotation);
-        }
-        @Override public String toString() {
-          return scopeAnnotation.getName();
-        }
-      };
-    }
-
-    public void in(final Scope scope) {
-      checkNotNull(scope, "scope");
-      checkNotScoped();
-      scoping = new AbstractScoping() {
-        @Override public Scope getScope() {
-          return scope;
-        }
-        public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
-          return visitor.visitScope(scope);
-        }
-        @Override public String toString() {
-          return String.valueOf(scope);
-        }
-      };
-    }
-
-    public void asEagerSingleton() {
-      checkNotScoped();
-      scoping = new AbstractScoping() {
-        public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
-          return visitor.visitEagerSingleton();
-        }
-        @Override public String toString() {
-          return "eager singleton";
-        }
-      };
-    }
-
-    private void checkNotTargetted() {
-      if (target != EMPTY_TARGET) {
-        binder.addError(IMPLEMENTATION_ALREADY_SET);
-      }
-    }
-
-    private void checkNotAnnotated() {
-      if (ModuleBinding.this.key.getAnnotationType() != null) {
-        binder.addError(ANNOTATION_ALREADY_SPECIFIED);
-      }
-    }
-
-    private void checkNotScoped() {
-      @SuppressWarnings("unchecked") BindingTargetVisitor<T,Boolean> supportsScopesOfT
-          = (BindingTargetVisitor<T,Boolean>) SUPPORTS_SCOPES;
-
-      // Scoping isn't allowed when we have only one instance.
-      if (!target.acceptTargetVisitor(supportsScopesOfT)) {
-        binder.addError(SINGLE_INSTANCE_AND_SCOPE);
-        return;
-      }
-
-      if (scoping != EMPTY_SCOPING) {
-        binder.addError(SCOPE_ALREADY_SET);
-      }
-    }
-
-    @Override public String toString() {
-      String type = key.getAnnotationType() == null
-          ? "AnnotatedBindingBuilder<"
-          : "LinkedBindingBuilder<";
-      return type + key.getTypeLiteral() + ">";
-    }
-  }
-
-  public ConstantBuilder constantBuilder(Binder binder) {
-    return new ConstantBuilder(binder);
-  }
-
-  /**
-   * Package-private write access to the internal state of this element.
-   */
-  class ConstantBuilder implements AnnotatedConstantBindingBuilder, ConstantBindingBuilder {
-    private final Binder binder;
-
-    ConstantBuilder(Binder binder) {
-      this.binder = binder.skipSources(ConstantBuilder.class);
-    }
-
-    public ConstantBindingBuilder annotatedWith(final Class<? extends Annotation> annotationType) {
-      checkNotNull(annotationType, "annotationType");
-      if (key.getAnnotationType() != null) {
-        binder.addError(ANNOTATION_ALREADY_SPECIFIED);
-      } else {
-        key = Key.get(key.getTypeLiteral(), annotationType);
-      }
-      return this;
-    }
-
-    public ConstantBindingBuilder annotatedWith(final Annotation annotation) {
-      checkNotNull(annotation, "annotation");
-      if (key.getAnnotationType() != null) {
-        binder.addError(ANNOTATION_ALREADY_SPECIFIED);
-      } else {
-        key = Key.get(key.getTypeLiteral(), annotation);
-      }
-      return this;
-    }
-
-    public void to(final String value) {
-      to(String.class, value);
-    }
-
-    public void to(final int value) {
-      to(Integer.class, value);
-    }
-
-    public void to(final long value) {
-      to(Long.class, value);
-    }
-
-    public void to(final boolean value) {
-      to(Boolean.class, value);
-    }
-
-    public void to(final double value) {
-      to(Double.class, value);
-    }
-
-    public void to(final float value) {
-      to(Float.class, value);
-    }
-
-    public void to(final short value) {
-      to(Short.class, value);
-    }
-
-    public void to(final char value) {
-      to(Character.class, value);
-    }
-
-    public void to(final Class<?> value) {
-      to(Class.class, value);
-    }
-
-    public <E extends Enum<E>> void to(final E value) {
-      to(value.getDeclaringClass(), value);
-    }
-
-    private void to(Class<?> type, Object instance) {
-      // this type will define T, so these assignments are safe
-      @SuppressWarnings("unchecked")
-      Class<T> typeAsClassT = (Class<T>) type;
-      @SuppressWarnings("unchecked")
-      T instanceAsT = (T) instance;
-
-      if (keyTypeIsSet()) {
-        binder.addError(CONSTANT_VALUE_ALREADY_SET);
-        return;
-      }
-
-      if (key.getAnnotation() != null) {
-        key = Key.get(typeAsClassT, key.getAnnotation());
-      } else if (key.getAnnotationType() != null) {
-        key = Key.get(typeAsClassT, key.getAnnotationType());
-      } else {
-        key = Key.get(typeAsClassT);
-      }
-
-      ModuleBinding.this.target = new InstanceTarget<T>(instanceAsT,
-          ImmutableSet.<InjectionPoint>of());
-
-      if (instanceAsT == null) {
-        binder.addError(BINDING_TO_NULL);
-      }
-    }
-
-    @Override public String toString() {
-      return key.getAnnotationType() == null
-          ? "AnnotatedConstantBindingBuilder"
-          : "ConstantBindingBuilder";
-    }
-  }
-
-  /**
-   * For private binder's expose() method.
-   */
-  public static class ExposureBuilder<T> implements AnnotatedElementBuilder {
-    private ModuleBinding<T> binding;
-    private final Binder binder;
-
-    public ExposureBuilder(ModuleBinding<T> binding, Binder binder) {
-      this.binding = binding;
-      this.binder = binder;
-    }
-
-    public void annotatedWith(Class<? extends Annotation> annotationType) {
-      checkNotNull(annotationType, "annotationType");
-      checkNotAnnotated();
-      binding.key = Key.get(binding.key.getTypeLiteral(), annotationType);
-    }
-
-    public void annotatedWith(Annotation annotation) {
-      checkNotNull(annotation, "annotation");
-      checkNotAnnotated();
-      binding.key = Key.get(binding.key.getTypeLiteral(), annotation);
-    }
-
-    public Key<?> getKey() {
-      return binding.key;
-    }
-
-    private void checkNotAnnotated() {
-      if (binding.key.getAnnotationType() != null) {
-        binder.addError(ANNOTATION_ALREADY_SPECIFIED);
-      }
-    }
-
-    @Override public String toString() {
-      return "AnnotatedElementBuilder";
-    }
-  }
-
-  /** A binding target, which provides instances from a specific key. */
-  private interface Target<T> {
-    <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor);
-  }
-
-  /** Immutable snapshot of a binding scope. */
-  private interface Scoping {
-    <V> V acceptVisitor(BindingScopingVisitor<V> visitor);
-  }
-
-  static class InstanceTarget<T> implements Target<T> {
-    private final T instance;
-    private final ImmutableSet<InjectionPoint> injectionPoints;
-
-    public InstanceTarget(T instance, Set<InjectionPoint> injectionPoints) {
-      this.instance = instance;
-      this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
-    }
-
-    public <V> V acceptTargetVisitor(BindingTargetVisitor<? super T, V> visitor) {
-      return visitor.visitInstance(instance, injectionPoints);
-    }
-  }
-}
diff --git a/src/com/google/inject/internal/ProviderInstanceBindingImpl.java b/src/com/google/inject/internal/ProviderInstanceBindingImpl.java
new file mode 100644
index 0000000..0f07e90
--- /dev/null
+++ b/src/com/google/inject/internal/ProviderInstanceBindingImpl.java
@@ -0,0 +1,89 @@
+/*
+Copyright (C) 2007 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package com.google.inject.internal;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.spi.BindingTargetVisitor;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.HasDependencies;
+import com.google.inject.spi.InjectionPoint;
+import com.google.inject.spi.ProviderInstanceBinding;
+import java.util.Set;
+
+public 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,
+      Object source, InternalFactory<? extends T> internalFactory, Scoping scoping,
+      Provider<? extends T> providerInstance,
+      Set<InjectionPoint> injectionPoints) {
+    super(injector, key, source, internalFactory, scoping);
+    this.providerInstance = providerInstance;
+    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
+  }
+
+  public ProviderInstanceBindingImpl(Object source, Key<T> key, Scoping scoping,
+      Set<InjectionPoint> injectionPoints, Provider<? extends T> providerInstance) {
+    super(source, key, scoping);
+    this.injectionPoints = ImmutableSet.copyOf(injectionPoints);
+    this.providerInstance = providerInstance;
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitProviderInstance(this);
+  }
+
+  public Provider<? extends T> getProviderInstance() {
+    return providerInstance;
+  }
+
+  public Set<InjectionPoint> getInjectionPoints() {
+    return injectionPoints;
+  }
+
+  public Set<Dependency<?>> getDependencies() {
+    return providerInstance instanceof HasDependencies
+        ? ImmutableSet.copyOf(((HasDependencies) providerInstance).getDependencies())
+        : Dependency.forInjectionPoints(injectionPoints);
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new ProviderInstanceBindingImpl<T>(
+        getSource(), getKey(), scoping, injectionPoints, providerInstance);
+  }
+
+  public BindingImpl<T> withKey(Key<T> key) {
+    return new ProviderInstanceBindingImpl<T>(
+        getSource(), key, getScoping(), injectionPoints, providerInstance);
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(ProviderInstanceBinding.class)
+        .add("key", getKey())
+        .add("provider", providerInstance)
+        .add("scope", getScoping())
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/internal/ProviderMethod.java b/src/com/google/inject/internal/ProviderMethod.java
index c30fcef..c6f8fa0 100644
--- a/src/com/google/inject/internal/ProviderMethod.java
+++ b/src/com/google/inject/internal/ProviderMethod.java
@@ -16,28 +16,31 @@
 
 package com.google.inject.internal;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.inject.Binder;
 import com.google.inject.Exposed;
 import com.google.inject.Key;
 import com.google.inject.Provider;
 import com.google.inject.binder.PrivateBinder;
+import com.google.inject.spi.Dependency;
+import com.google.inject.spi.ProviderWithDependencies;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Set;
 
 /**
  * A provider that invokes a method and returns its result.
  *
  * @author jessewilson@google.com (Jesse Wilson)
  */
-public class ProviderMethod<T> implements Provider<T> {
-  // TODO: this should be a top-level implementation of Binding
-
+public class ProviderMethod<T> implements ProviderWithDependencies<T> {
   private final Key<T> key;
   private final Class<? extends Annotation> scopeAnnotation;
   private final Object instance;
   private final Method method;
+  private final ImmutableSet<Dependency<?>> dependencies;
   private final List<Provider<?>> parameterProviders;
   private final boolean exposed;
 
@@ -45,10 +48,12 @@
    * @param method the method to invoke. It's return type must be the same type as {@code key}.
    */
   ProviderMethod(Key<T> key, Method method, Object instance,
-      List<Provider<?>> parameterProviders, Class<? extends Annotation> scopeAnnotation) {
+      ImmutableSet<Dependency<?>> dependencies, List<Provider<?>> parameterProviders,
+      Class<? extends Annotation> scopeAnnotation) {
     this.key = key;
     this.scopeAnnotation = scopeAnnotation;
     this.instance = instance;
+    this.dependencies = dependencies;
     this.method = method;
     this.parameterProviders = parameterProviders;
     this.exposed = method.isAnnotationPresent(Exposed.class);
@@ -97,4 +102,8 @@
       throw new RuntimeException(e);
     }
   }
+
+  public Set<Dependency<?>> getDependencies() {
+    return dependencies;
+  }
 }
diff --git a/src/com/google/inject/internal/ProviderMethodsModule.java b/src/com/google/inject/internal/ProviderMethodsModule.java
index 1b873cb..2346dbb 100644
--- a/src/com/google/inject/internal/ProviderMethodsModule.java
+++ b/src/com/google/inject/internal/ProviderMethodsModule.java
@@ -17,6 +17,7 @@
 package com.google.inject.internal;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.inject.Binder;
 import com.google.inject.Key;
@@ -24,6 +25,7 @@
 import com.google.inject.Provider;
 import com.google.inject.Provides;
 import com.google.inject.TypeLiteral;
+import com.google.inject.spi.Dependency;
 import com.google.inject.spi.Message;
 import com.google.inject.util.Modules;
 import java.lang.annotation.Annotation;
@@ -82,11 +84,13 @@
     Errors errors = new Errors(method);
 
     // prepare the parameter providers
+    List<Dependency<?>> dependencies = Lists.newArrayList();
     List<Provider<?>> parameterProviders = Lists.newArrayList();
     List<TypeLiteral<?>> parameterTypes = typeLiteral.getParameterTypes(method);
     Annotation[][] parameterAnnotations = method.getParameterAnnotations();
     for (int i = 0; i < parameterTypes.size(); i++) {
       Key<?> key = getKey(errors, parameterTypes.get(i), method, parameterAnnotations[i]);
+      dependencies.add(Dependency.get(key));
       parameterProviders.add(binder.getProvider(key));
     }
 
@@ -101,7 +105,8 @@
       binder.addError(message);
     }
 
-    return new ProviderMethod<T>(key, method, delegate, parameterProviders, scopeAnnotation);
+    return new ProviderMethod<T>(key, method, delegate, ImmutableSet.copyOf(dependencies),
+        parameterProviders, scopeAnnotation);
   }
 
   <T> Key<T> getKey(Errors errors, TypeLiteral<T> type, Member member, Annotation[] annotations) {
diff --git a/src/com/google/inject/internal/Scoping.java b/src/com/google/inject/internal/Scoping.java
new file mode 100644
index 0000000..d39b4ba
--- /dev/null
+++ b/src/com/google/inject/internal/Scoping.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.inject.Scope;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.google.inject.Stage;
+import com.google.inject.spi.BindingScopingVisitor;
+import java.lang.annotation.Annotation;
+
+/**
+ * References a scope, either directly (as a scope instance), or indirectly (as a scope annotation).
+ * The scope's eager or laziness is also exposed.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ */
+public abstract class Scoping {
+
+  /**
+   * No scoping annotation has been applied. Note that this is different from {@code
+   * in(Scopes.NO_SCOPE)}, where the 'NO_SCOPE' has been explicitly applied.
+   */
+  public static final Scoping UNSCOPED = new Scoping() {
+    public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+      return visitor.visitNoScoping();
+    }
+
+    @Override public Scope getScopeInstance() {
+      return Scopes.NO_SCOPE;
+    }
+
+    @Override public String toString() {
+      return Scopes.NO_SCOPE.toString();
+    }
+  };
+
+  public static final Scoping SINGLETON_ANNOTATION = new Scoping() {
+    public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+      return visitor.visitScopeAnnotation(Singleton.class);
+    }
+
+    @Override public Class<? extends Annotation> getScopeAnnotation() {
+      return Singleton.class;
+    }
+
+    @Override public String toString() {
+      return Singleton.class.getName();
+    }
+  };
+
+  public static final Scoping SINGLETON_INSTANCE = new Scoping() {
+    public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+      return visitor.visitScope(Scopes.SINGLETON);
+    }
+
+    @Override public Scope getScopeInstance() {
+      return Scopes.SINGLETON;
+    }
+
+    @Override public String toString() {
+      return Scopes.SINGLETON.toString();
+    }
+  };
+
+  public static final Scoping EAGER_SINGLETON = new Scoping() {
+    public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+      return visitor.visitEagerSingleton();
+    }
+
+    @Override public Scope getScopeInstance() {
+      return Scopes.SINGLETON;
+    }
+
+    @Override public String toString() {
+      return "eager singleton";
+    }
+  };
+
+  public static Scoping forAnnotation(final Class<? extends Annotation> scopingAnnotation) {
+    if (scopingAnnotation == Singleton.class) {
+      return SINGLETON_ANNOTATION;
+    }
+
+    return new Scoping() {
+      public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+        return visitor.visitScopeAnnotation(scopingAnnotation);
+      }
+
+      @Override public Class<? extends Annotation> getScopeAnnotation() {
+        return scopingAnnotation;
+      }
+
+      @Override public String toString() {
+        return scopingAnnotation.getName();
+      }
+    };
+  }
+
+  public static Scoping forInstance(final Scope scope) {
+    if (scope == Scopes.SINGLETON) {
+      return SINGLETON_INSTANCE;
+    }
+
+    return new Scoping() {
+      public <V> V acceptVisitor(BindingScopingVisitor<V> visitor) {
+        return visitor.visitScope(scope);
+      }
+
+      @Override public Scope getScopeInstance() {
+        return scope;
+      }
+
+      @Override public String toString() {
+        return scope.toString();
+      }
+    };
+  }
+
+  /**
+   * Returns true if this scope was explicitly applied. If no scope was explicitly applied then the
+   * scoping annotation will be used.
+   */
+  public boolean isExplicitlyScoped() {
+    return this != UNSCOPED;
+  }
+
+  /**
+   * Returns true if this is the default scope. In this case a new instance will be provided for
+   * each injection.
+   */
+  public boolean isNoScope() {
+    return getScopeInstance() == Scopes.NO_SCOPE;
+  }
+
+  /**
+   * Returns true if this scope is a singleton that should be loaded eagerly in {@code stage}.
+   */
+  public boolean isEagerSingleton(Stage stage) {
+    if (this == EAGER_SINGLETON) {
+      return true;
+    }
+
+    if (stage == Stage.PRODUCTION) {
+      return this == SINGLETON_ANNOTATION || this == SINGLETON_INSTANCE;
+    }
+
+    return false;
+  }
+
+  /**
+   * Returns the scope instance, or {@code null} if that isn't known for this instance.
+   */
+  public Scope getScopeInstance() {
+    return null;
+  }
+
+  /**
+   * Returns the scope annotation, or {@code null} if that isn't known for this instance.
+   */
+  public Class<? extends Annotation> getScopeAnnotation() {
+    return null;
+  }
+
+  public abstract <V> V acceptVisitor(BindingScopingVisitor<V> visitor);
+
+  private Scoping() {}
+}
diff --git a/src/com/google/inject/internal/UntargettedBindingImpl.java b/src/com/google/inject/internal/UntargettedBindingImpl.java
new file mode 100644
index 0000000..f1b96ed
--- /dev/null
+++ b/src/com/google/inject/internal/UntargettedBindingImpl.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2007 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.internal;
+
+import com.google.inject.Injector;
+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> {
+
+  public UntargettedBindingImpl(Injector 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();
+      }
+    }, Scoping.UNSCOPED);
+  }
+
+  public UntargettedBindingImpl(Object source, Key<T> key, Scoping scoping) {
+    super(source, key, scoping);
+  }
+
+  public <V> V acceptTargetVisitor(BindingTargetVisitor<T, V> visitor) {
+    return visitor.visitUntargetted(this);
+  }
+
+  public BindingImpl<T> withScoping(Scoping scoping) {
+    return new UntargettedBindingImpl<T>(getSource(), getKey(), scoping);
+  }
+
+  public BindingImpl<T> withKey(Key<T> key) {
+    return new UntargettedBindingImpl<T>(getSource(), key, getScoping());
+  }
+
+  @Override public String toString() {
+    return new ToStringBuilder(UntargettedBinding.class)
+        .add("key", getKey())
+        .add("source", getSource())
+        .toString();
+  }
+}
diff --git a/src/com/google/inject/spi/BindingTargetVisitor.java b/src/com/google/inject/spi/BindingTargetVisitor.java
index 1e92217..e7dd31f 100644
--- a/src/com/google/inject/spi/BindingTargetVisitor.java
+++ b/src/com/google/inject/spi/BindingTargetVisitor.java
@@ -16,11 +16,6 @@
 
 package com.google.inject.spi;
 
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import java.lang.reflect.Constructor;
-import java.util.Set;
-
 /**
  * Visits each of the strategies used to find an instance to satisfy an injection.
  *
@@ -33,84 +28,56 @@
   /**
    * Visit a instance binding. The same instance is returned for every injection. This target is
    * found in both module and injector bindings.
-   *
-   * @param instance the user-supplied value
-   * @param injectionPoints the field and method injection points of the instance, injected at
-   *      injector-creation time only.
    */
-  V visitInstance(T instance, Set<InjectionPoint> injectionPoints);
+  V visitInstance(InstanceBinding<T> binding);
 
   /**
    * Visit a provider instance binding. The provider's {@code get} method is invoked to resolve
    * injections. This target is found in both module and injector bindings.
-   *
-   * @param provider the user-supplied, unscoped provider
-   * @param injectionPoints the field and method injection points of the provider, injected at
-   *      injector-creation time only.
    */
-  V visitProvider(Provider<? extends T> provider, Set<InjectionPoint> injectionPoints);
+  V visitProviderInstance(ProviderInstanceBinding<T> binding);
 
   /**
-   * Visit a provider key binding. To resolve injections, the provider injection is first
-   * resolved, then that provider's {@code get} method is invoked. This target is found in both
-   * module and injector bindings.
-   *
-   * @param providerKey the key used to resolve the provider's binding. That binding can be
-   *      retrieved from an injector using {@link com.google.inject.Injector#getBinding(Key)
-   *      Injector.getBinding(providerKey)}
+   * Visit a provider key binding. To resolve injections, the provider key is first resolved, then
+   * that provider's {@code get} method is invoked. This target is found in both module and injector
+   * bindings.
    */
-  V visitProviderKey(Key<? extends Provider<? extends T>> providerKey);
+  V visitProviderKey(ProviderKeyBinding<T> binding);
 
   /**
    * Visit a linked key binding. The other key's binding is used to resolve injections. This
    * target is found in both module and injector bindings.
-   *
-   * @param key the linked key used to resolve injections. That binding can be retrieved from an
-   *      injector using {@link com.google.inject.Injector#getBinding(Key) Injector.getBinding(key)}
    */
-  V visitKey(Key<? extends T> key);
+  V visitLinkedKey(LinkedKeyBinding<T> binding);
 
   /**
    * Visit a binding to a key exposed from an enclosed private environment. This target is found in
    * both module and injector bindings.
-   *
-   * @param privateEnvironment an enclosed environment that holds the original binding.
    */
-  V visitExposed(PrivateEnvironment privateEnvironment);
+  V visitExposed(ExposedBinding<T> binding);
 
   /**
    * Visit an untargetted binding. This target is found only on module bindings. It indicates
    * that the injector should use its implicit binding strategies to resolve injections.
    */
-  V visitUntargetted();
+  V visitUntargetted(UntargettedBinding<T> binding);
 
   /**
    * Visit a constructor binding. To resolve injections, an instance is instantiated by invoking
    * {@code constructor}. This target is found only on injector bindings.
-   *
-   * @param constructor the {@link com.google.inject.Inject annotated} or default constructor that
-   *      is invoked for creating values
-   * @param injectionPoints the constructor, field and method injection points to create and
-   *      populate a new instance. The set contains exactly one constructor injection point.
    */
-  V visitConstructor(Constructor<? extends T> constructor, Set<InjectionPoint> injectionPoints);
+  V visitConstructor(ConstructorBinding<T> binding);
 
   /**
    * Visit a binding created from converting a bound instance to a new type. The source binding
    * has the same binding annotation but a different type. This target is found only on injector
    * bindings.
-   *
-   * @param value the converted value
    */
-  V visitConvertedConstant(T value);
+  V visitConvertedConstant(ConvertedConstantBinding<T> binding);
 
   /**
    * Visit a binding to a {@link com.google.inject.Provider} that delegates to the binding for the
    * provided type. This target is found only on injector bindings.
-   *
-   * @param provided the key whose binding is used to {@link com.google.inject.Provider#get provide
-   *      instances}. That binding can be retrieved from an injector using {@link
-   *      com.google.inject.Injector#getBinding(Key) Injector.getBinding(provided)}
    */
-  V visitProviderBinding(Key<?> provided);
+  V visitProviderBinding(ProviderBinding<?> binding);
 }
diff --git a/src/com/google/inject/spi/ConstructorBinding.java b/src/com/google/inject/spi/ConstructorBinding.java
new file mode 100644
index 0000000..6b4113a
--- /dev/null
+++ b/src/com/google/inject/spi/ConstructorBinding.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import java.lang.reflect.Constructor;
+import java.util.Set;
+
+/**
+ * A binding to the constructor of a concrete clss. To resolve injections, an instance is
+ * instantiated by invoking the constructor.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface ConstructorBinding<T> extends Binding<T>, HasDependencies {
+
+  /**
+   * Returns the {@link com.google.inject.Inject annotated} or default constructor that is invoked
+   * for creating values.
+   */
+  Constructor<? extends T> getConstructor();
+
+  /**
+   * Returns the constructor, field and method injection points to create and populate a new
+   * instance. The set contains exactly one constructor injection point.
+   */
+  Set<InjectionPoint> getInjectionPoints();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/ConvertedConstantBinding.java b/src/com/google/inject/spi/ConvertedConstantBinding.java
new file mode 100644
index 0000000..6049f7d
--- /dev/null
+++ b/src/com/google/inject/spi/ConvertedConstantBinding.java
@@ -0,0 +1,40 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import java.util.Set;
+
+/**
+ * A binding created from converting a bound instance to a new type. The source binding has the same
+ * binding annotation but a different type.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface ConvertedConstantBinding<T> extends Binding<T>, HasDependencies {
+
+  /**
+   * Returns the converted value.
+   */
+  T getValue();
+
+  /**
+   * Returns a singleton set containing only the converted key.
+   */
+  Set<Dependency<?>> getDependencies();
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/DefaultBindingTargetVisitor.java b/src/com/google/inject/spi/DefaultBindingTargetVisitor.java
index c213dbc..9ab15c2 100644
--- a/src/com/google/inject/spi/DefaultBindingTargetVisitor.java
+++ b/src/com/google/inject/spi/DefaultBindingTargetVisitor.java
@@ -16,14 +16,11 @@
 
 package com.google.inject.spi;
 
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import java.lang.reflect.Constructor;
-import java.util.Set;
+import com.google.inject.Binding;
 
 /**
- * No-op visitor for subclassing. All interface methods simply delegate to
- * {@link #visitOther()}, returning its result.
+ * No-op visitor for subclassing. All interface methods simply delegate to {@link
+ * #visitOther(Binding)}, returning its result.
  *
  * @param <V> any type to be returned by the visit method. Use {@link Void} with
  *     {@code return null} if no return type is needed.
@@ -33,44 +30,44 @@
  */
 public abstract class DefaultBindingTargetVisitor<T, V> implements BindingTargetVisitor<T, V> {
 
-  protected V visitOther() {
+  protected V visitOther(Binding<T> binding) {
     return null;
   }
 
-  public V visitInstance(T instance, Set<InjectionPoint> injectionPoints) {
-    return visitOther();
+  public V visitInstance(InstanceBinding<T> instanceBinding) {
+    return visitOther(instanceBinding);
   }
 
-  public V visitProvider(Provider<? extends T> provider, Set<InjectionPoint> injectionPoints) {
-    return visitOther();
+  public V visitProviderInstance(ProviderInstanceBinding<T> providerInstanceBinding) {
+    return visitOther(providerInstanceBinding);
   }
 
-  public V visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
-    return visitOther();
+  public V visitProviderKey(ProviderKeyBinding<T> providerKeyBinding) {
+    return visitOther(providerKeyBinding);
   }
 
-  public V visitKey(Key<? extends T> key) {
-    return visitOther();
+  public V visitLinkedKey(LinkedKeyBinding<T> linkedKeyBinding) {
+    return visitOther(linkedKeyBinding);
   }
 
-  public V visitUntargetted() {
-    return visitOther();
+  public V visitExposed(ExposedBinding<T> exposedBinding) {
+    return visitOther(exposedBinding);
   }
 
-  public V visitConstructor(Constructor<? extends T> constructor,
-      Set<InjectionPoint> injectionPoints) {
-    return visitOther();
+  public V visitUntargetted(UntargettedBinding<T> untargettedBinding) {
+    return visitOther(untargettedBinding);
   }
 
-  public V visitConvertedConstant(T value) {
-    return visitOther();
+  public V visitConstructor(ConstructorBinding<T> constructorBinding) {
+    return visitOther(constructorBinding);
   }
 
-  public V visitProviderBinding(Key<?> provided) {
-    return visitOther();
+  public V visitConvertedConstant(ConvertedConstantBinding<T> convertedConstantBinding) {
+    return visitOther(convertedConstantBinding);
   }
 
-  public V visitExposed(PrivateEnvironment privateEnvironment) {
-    return visitOther();
+  @SuppressWarnings("unchecked") // if we visit a ProviderBinding, we know T == Provider<?>
+  public V visitProviderBinding(ProviderBinding<?> providerBinding) {
+    return visitOther((Binding<T>) providerBinding);
   }
 }
diff --git a/src/com/google/inject/spi/Dependency.java b/src/com/google/inject/spi/Dependency.java
index 67c16bf..280f80c 100644
--- a/src/com/google/inject/spi/Dependency.java
+++ b/src/com/google/inject/spi/Dependency.java
@@ -17,8 +17,12 @@
 package com.google.inject.spi;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import com.google.inject.Key;
 import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
 
 /**
  * A variable that can be resolved by an injector.
@@ -53,6 +57,17 @@
   }
 
   /**
+   * Returns the dependencies from the given injection points.
+   */
+  public static Set<Dependency<?>> forInjectionPoints(Set<InjectionPoint> injectionPoints) {
+    List<Dependency<?>> dependencies = Lists.newArrayList();
+    for (InjectionPoint injectionPoint : injectionPoints) {
+      dependencies.addAll(injectionPoint.getDependencies());
+    }
+    return ImmutableSet.copyOf(dependencies);
+  }
+
+  /**
    * Returns the key to the binding that satisfies this dependency.
    */
   public Key<T> getKey() {
diff --git a/src/com/google/inject/spi/Elements.java b/src/com/google/inject/spi/Elements.java
index 284574f..85a86a1 100644
--- a/src/com/google/inject/spi/Elements.java
+++ b/src/com/google/inject/spi/Elements.java
@@ -23,6 +23,7 @@
 import com.google.common.collect.Sets;
 import com.google.inject.AbstractModule;
 import com.google.inject.Binder;
+import com.google.inject.Binding;
 import com.google.inject.Key;
 import com.google.inject.Module;
 import com.google.inject.PrivateModule;
@@ -34,9 +35,10 @@
 import com.google.inject.binder.AnnotatedConstantBindingBuilder;
 import com.google.inject.binder.AnnotatedElementBuilder;
 import com.google.inject.binder.PrivateBinder;
+import com.google.inject.internal.AbstractBindingBuilder;
+import com.google.inject.internal.BindingBuilder;
+import com.google.inject.internal.ConstantBindingBuilderImpl;
 import com.google.inject.internal.Errors;
-import com.google.inject.internal.ModuleBinding;
-import com.google.inject.internal.ModuleBinding.ExposureBuilder;
 import com.google.inject.internal.ProviderMethodsModule;
 import com.google.inject.internal.SourceProvider;
 import com.google.inject.matcher.Matcher;
@@ -59,11 +61,11 @@
 public final class Elements {
   private static final BindingTargetVisitor<Object, Object> GET_INSTANCE_VISITOR
       = new DefaultBindingTargetVisitor<Object, Object>() {
-    @Override public Object visitInstance(Object instance, Set<InjectionPoint> injectionPoints) {
-      return instance;
+    @Override public Object visitInstance(InstanceBinding<Object> binding) {
+      return binding.getInstance();
     }
 
-    @Override protected Object visitOther() {
+    @Override protected Object visitOther(Binding<Object> binding) {
       throw new IllegalArgumentException();
     }
   };
@@ -121,8 +123,9 @@
       this.modules = Sets.newHashSet();
       this.elements = Lists.newArrayList();
       this.source = null;
-      this.sourceProvider = new SourceProvider()
-          .plusSkippedClasses(Elements.class, RecordingBinder.class, AbstractModule.class);
+      this.sourceProvider = new SourceProvider().plusSkippedClasses(
+          Elements.class, RecordingBinder.class, AbstractModule.class,
+          ConstantBindingBuilderImpl.class, AbstractBindingBuilder.class, BindingBuilder.class);
       this.parent = null;
       this.privateEnvironment = null;
     }
@@ -214,9 +217,7 @@
     }
 
     public <T> AnnotatedBindingBuilder<T> bind(Key<T> key) {
-      ModuleBinding<T> moduleBindingCommand = new ModuleBinding<T>(getSource(), key);
-      elements.add(moduleBindingCommand);
-      return moduleBindingCommand.regularBuilder(RecordingBinder.this);
+      return new BindingBuilder<T>(this, elements, getSource(), key);
     }
 
     public <T> AnnotatedBindingBuilder<T> bind(TypeLiteral<T> typeLiteral) {
@@ -228,9 +229,7 @@
     }
 
     public AnnotatedConstantBindingBuilder bindConstant() {
-      ModuleBinding<Object> moduleBindingCommand = new ModuleBinding<Object>(getSource());
-      elements.add(moduleBindingCommand);
-      return moduleBindingCommand.constantBuilder(RecordingBinder.this);
+      return new ConstantBindingBuilderImpl<Void>(this, elements, getSource());
     }
 
     public <T> Provider<T> getProvider(final Key<T> key) {
@@ -301,10 +300,10 @@
         };
       }
 
-      ModuleBinding<T> exposeBinding = new ModuleBinding<T>(getSource(), key);
-      parent.elements.add(exposeBinding);
+      BindingBuilder<T> exposeBinding = new BindingBuilder<T>(
+          this, parent.elements, getSource(), key);
 
-      ExposureBuilder<T> builder = exposeBinding.exposedKeyBuilder(this, privateEnvironment);
+      BindingBuilder.ExposureBuilder<T> builder = exposeBinding.usingKeyFrom(privateEnvironment);
       privateEnvironment.addExposureBuilder(builder);
       return builder;
     }
diff --git a/src/com/google/inject/LoadStrategy.java b/src/com/google/inject/spi/ExposedBinding.java
similarity index 64%
copy from src/com/google/inject/LoadStrategy.java
copy to src/com/google/inject/spi/ExposedBinding.java
index 326e69c..f220595 100644
--- a/src/com/google/inject/LoadStrategy.java
+++ b/src/com/google/inject/spi/ExposedBinding.java
@@ -14,12 +14,21 @@
  * limitations under the License.
  */
 
+package com.google.inject.spi;
 
-package com.google.inject;
+import com.google.inject.Binding;
 
 /**
+ * A binding to a key exposed from an enclosed private environment.
+ *
  * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
  */
-enum LoadStrategy {
-  EAGER, LAZY
-}
+public interface ExposedBinding<T> extends Binding<T>, HasDependencies {
+
+  /**
+   * Returns the enclosed environment that holds the original binding.
+   */
+  PrivateEnvironment getPrivateEnvironment();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/HasDependencies.java b/src/com/google/inject/spi/HasDependencies.java
new file mode 100644
index 0000000..77a5523
--- /dev/null
+++ b/src/com/google/inject/spi/HasDependencies.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import java.util.Set;
+
+/**
+ * Implemented by {@link com.google.inject.Binding bindings}, {@link com.google.inject.Provider
+ * providers} and instances that expose their dependencies explicitly.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface HasDependencies {
+
+  /**
+   * Returns the known dependencies for this type. If this has dependencies whose values are not
+   * known statically, a dependency for the {@link com.google.inject.Injector Injector} will be
+   * included in the returned set.
+   * 
+   * @return a possibly empty set
+   */
+  Set<Dependency<?>> getDependencies();
+}
diff --git a/src/com/google/inject/spi/InstanceBinding.java b/src/com/google/inject/spi/InstanceBinding.java
new file mode 100644
index 0000000..095e78a
--- /dev/null
+++ b/src/com/google/inject/spi/InstanceBinding.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import java.util.Set;
+
+/**
+ * A binding to a single instance. The same instance is returned for every injection.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface InstanceBinding<T> extends Binding<T>, HasDependencies {
+
+  /**
+   * Returns the user-supplied instance.
+   */
+  T getInstance();
+
+  /**
+   * Returns the field and method injection points of the instance, injected at injector-creation
+   * time only.
+   *
+   * @return a possibly empty set
+   */
+  Set<InjectionPoint> getInjectionPoints();
+
+}
diff --git a/src/com/google/inject/spi/LinkedKeyBinding.java b/src/com/google/inject/spi/LinkedKeyBinding.java
new file mode 100644
index 0000000..7b823a6
--- /dev/null
+++ b/src/com/google/inject/spi/LinkedKeyBinding.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import com.google.inject.Key;
+
+/**
+ * A binding to a linked key. The other key's binding is used to resolve injections.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface LinkedKeyBinding<T> extends Binding<T> {
+
+  /**
+   * Returns the linked key used to resolve injections. That binding can be retrieved from an
+   * injector using {@link com.google.inject.Injector#getBinding(Key) Injector.getBinding(key)}.
+   */
+  Key<? extends T> getLinkedKey();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/ModuleWriter.java b/src/com/google/inject/spi/ModuleWriter.java
index 7d9b3fd..f0eaf35 100644
--- a/src/com/google/inject/spi/ModuleWriter.java
+++ b/src/com/google/inject/spi/ModuleWriter.java
@@ -28,10 +28,8 @@
 import com.google.inject.binder.PrivateBinder;
 import com.google.inject.binder.ScopedBindingBuilder;
 import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import org.aopalliance.intercept.MethodInterceptor;
 
 /**
@@ -167,45 +165,42 @@
   protected <T> ScopedBindingBuilder bindKeyToTarget(
       final Binding<T> binding, final Binder binder, final Key<T> key) {
     return binding.acceptTargetVisitor(new BindingTargetVisitor<T, ScopedBindingBuilder>() {
-      public ScopedBindingBuilder visitInstance(T instance, Set<InjectionPoint> injectionPoints) {
-        binder.bind(key).toInstance(instance);
+      public ScopedBindingBuilder visitInstance(InstanceBinding<T> binding) {
+        binder.bind(key).toInstance(binding.getInstance());
         return null;
       }
 
-      public ScopedBindingBuilder visitProvider(Provider<? extends T> provider,
-          Set<InjectionPoint> injectionPoints) {
-        return binder.bind(key).toProvider(provider);
+      public ScopedBindingBuilder visitProviderInstance(ProviderInstanceBinding<T> binding) {
+        return binder.bind(key).toProvider(binding.getProviderInstance());
       }
 
-      public ScopedBindingBuilder visitProviderKey(
-          Key<? extends Provider<? extends T>> providerKey) {
-        return binder.bind(key).toProvider(providerKey);
+      public ScopedBindingBuilder visitProviderKey(ProviderKeyBinding<T> binding) {
+        return binder.bind(key).toProvider(binding.getProviderKey());
       }
 
-      public ScopedBindingBuilder visitKey(Key<? extends T> targetKey) {
-        return binder.bind(key).to(targetKey);
+      public ScopedBindingBuilder visitLinkedKey(LinkedKeyBinding<T> binding) {
+        return binder.bind(key).to(binding.getLinkedKey());
       }
 
-      public ScopedBindingBuilder visitUntargetted() {
+      public ScopedBindingBuilder visitUntargetted(UntargettedBinding<T> binding) {
         return binder.bind(key);
       }
 
-      public ScopedBindingBuilder visitExposed(PrivateEnvironment privateEnvironment) {
-        PrivateBinder privateBinder = getPrivateBinder(privateEnvironment);
+      public ScopedBindingBuilder visitExposed(ExposedBinding<T> binding) {
+        PrivateBinder privateBinder = getPrivateBinder(binding.getPrivateEnvironment());
         privateBinder.withSource(binding.getSource()).expose(key);
         return null;
       }
 
-      public ScopedBindingBuilder visitConvertedConstant(T value) {
+      public ScopedBindingBuilder visitConvertedConstant(ConvertedConstantBinding<T> binding) {
         throw new IllegalArgumentException("Non-module element");
       }
 
-      public ScopedBindingBuilder visitConstructor(Constructor<? extends T> constructor,
-          Set<InjectionPoint> injectionPoints) {
+      public ScopedBindingBuilder visitConstructor(ConstructorBinding<T> binding) {
         throw new IllegalArgumentException("Non-module element");
       }
 
-      public ScopedBindingBuilder visitProviderBinding(Key<?> provided) {
+      public ScopedBindingBuilder visitProviderBinding(ProviderBinding<?> binding) {
         throw new IllegalArgumentException("Non-module element");
       }
     });
diff --git a/src/com/google/inject/spi/PrivateEnvironment.java b/src/com/google/inject/spi/PrivateEnvironment.java
index 080dcd9..1cf7319 100644
--- a/src/com/google/inject/spi/PrivateEnvironment.java
+++ b/src/com/google/inject/spi/PrivateEnvironment.java
@@ -22,7 +22,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.google.inject.Key;
-import com.google.inject.internal.ModuleBinding.ExposureBuilder;
+import com.google.inject.internal.BindingBuilder.ExposureBuilder;
 import java.util.List;
 import java.util.Set;
 
diff --git a/src/com/google/inject/spi/ProviderBinding.java b/src/com/google/inject/spi/ProviderBinding.java
new file mode 100644
index 0000000..2054f8d
--- /dev/null
+++ b/src/com/google/inject/spi/ProviderBinding.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+
+/**
+ * A binding to a {@link Provider} that delegates to the binding for the provided type. This binding
+ * is used whenever a {@code Provider<T>} is injected (as opposed to injecting {@code T} directly).
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface ProviderBinding<T> extends Binding<Provider<T>> {
+
+  /**
+   * Returns the key whose binding is used to {@link Provider#get provide instances}. That binding
+   * can be retrieved from an injector using {@link com.google.inject.Injector#getBinding(Key)
+   * Injector.getBinding(providedKey)}
+   */
+  Key<? extends T> getProvidedKey();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/ProviderInstanceBinding.java b/src/com/google/inject/spi/ProviderInstanceBinding.java
new file mode 100644
index 0000000..00e3ab9
--- /dev/null
+++ b/src/com/google/inject/spi/ProviderInstanceBinding.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import com.google.inject.Provider;
+import java.util.Set;
+
+/**
+ * A binding to a provider instance. The provider's {@code get} method is invoked to resolve
+ * injections.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface ProviderInstanceBinding<T> extends Binding<T>, HasDependencies {
+
+  /**
+   * Returns the user-supplied, unscoped provider.
+   */
+  Provider<? extends T> getProviderInstance();
+
+  /**
+   * Returns the field and method injection points of the provider, injected at injector-creation
+   * time only.
+   *
+   * @return a possibly empty set
+   */
+  Set<InjectionPoint> getInjectionPoints();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/spi/ProviderKeyBinding.java b/src/com/google/inject/spi/ProviderKeyBinding.java
new file mode 100644
index 0000000..db061a3
--- /dev/null
+++ b/src/com/google/inject/spi/ProviderKeyBinding.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.inject.Binding;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+
+/**
+ * A binding to a provider key. To resolve injections, the provider key is first resolved, then that
+ * provider's {@code get} method is invoked.
+ *
+ * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
+ */
+public interface ProviderKeyBinding<T> extends Binding<T> {
+
+  /**
+   * Returns the key used to resolve the provider's binding. That binding can be retrieved from an
+   * injector using {@link com.google.inject.Injector#getBinding(Key)
+   * Injector.getBinding(providerKey)}
+   */
+  Key<? extends Provider<? extends T>> getProviderKey();
+
+}
\ No newline at end of file
diff --git a/src/com/google/inject/LoadStrategy.java b/src/com/google/inject/spi/ProviderWithDependencies.java
similarity index 62%
copy from src/com/google/inject/LoadStrategy.java
copy to src/com/google/inject/spi/ProviderWithDependencies.java
index 326e69c..be87379 100644
--- a/src/com/google/inject/LoadStrategy.java
+++ b/src/com/google/inject/spi/ProviderWithDependencies.java
@@ -14,12 +14,14 @@
  * limitations under the License.
  */
 
+package com.google.inject.spi;
 
-package com.google.inject;
+import com.google.inject.Provider;
 
 /**
- * @author jessewilson@google.com (Jesse Wilson)
+ * A provider with dependencies on other injected types. If a {@link Provider} has dependencies that
+ * aren't specified in injections, this interface should be used to expose all dependencies.
+ *
+ * @since 2.0
  */
-enum LoadStrategy {
-  EAGER, LAZY
-}
+public interface ProviderWithDependencies<T> extends Provider<T>, HasDependencies {}
diff --git a/src/com/google/inject/LoadStrategy.java b/src/com/google/inject/spi/UntargettedBinding.java
similarity index 69%
rename from src/com/google/inject/LoadStrategy.java
rename to src/com/google/inject/spi/UntargettedBinding.java
index 326e69c..4f6f823 100644
--- a/src/com/google/inject/LoadStrategy.java
+++ b/src/com/google/inject/spi/UntargettedBinding.java
@@ -14,12 +14,15 @@
  * limitations under the License.
  */
 
+package com.google.inject.spi;
 
-package com.google.inject;
+import com.google.inject.Binding;
 
 /**
+ * An untargetted binding. This binding indicates that the injector should use its implicit binding
+ * strategies to resolve injections.
+ *
  * @author jessewilson@google.com (Jesse Wilson)
+ * @since 2.0
  */
-enum LoadStrategy {
-  EAGER, LAZY
-}
+public interface UntargettedBinding<T> extends Binding<T> {}
diff --git a/test/com/google/inject/AllTests.java b/test/com/google/inject/AllTests.java
index 8fd0d34..f7db268 100644
--- a/test/com/google/inject/AllTests.java
+++ b/test/com/google/inject/AllTests.java
@@ -25,6 +25,7 @@
 import com.google.inject.matcher.MatcherTest;
 import com.google.inject.name.NamesTest;
 import com.google.inject.spi.ElementsTest;
+import com.google.inject.spi.HasDependenciesTest;
 import com.google.inject.spi.InjectionPointTest;
 import com.google.inject.spi.ModuleRewriterTest;
 import com.google.inject.spi.ModuleWriterTest;
@@ -71,7 +72,6 @@
     suite.addTestSuite(ParentInjectorTest.class);
     suite.addTestSuite(PrivateModuleTest.class);
     suite.addTestSuite(ProviderInjectionTest.class);
-    suite.addTestSuite(ProviderMethodsTest.class);
     suite.addTestSuite(ProvisionExceptionTest.class);
     suite.addTestSuite(ProxyFactoryTest.class);
     suite.addTest(ReferenceMapTestSuite.suite());
@@ -84,8 +84,10 @@
     suite.addTestSuite(TypeLiteralTest.class);
     suite.addTestSuite(TypeLiteralTypeResolutionTest.class);
 
-    // commands
+    // spi
     suite.addTestSuite(ElementsTest.class);
+    suite.addTestSuite(HasDependenciesTest.class);
+    suite.addTestSuite(ProviderMethodsTest.class);
     suite.addTestSuite(ModuleWriterTest.class);
     suite.addTestSuite(ModuleRewriterTest.class);
     suite.addTestSuite(SpiBindingsTest.class);
diff --git a/test/com/google/inject/BinderTest.java b/test/com/google/inject/BinderTest.java
index 2f8f00c..3d84727 100644
--- a/test/com/google/inject/BinderTest.java
+++ b/test/com/google/inject/BinderTest.java
@@ -170,13 +170,15 @@
           assertEquals("Provider<java.util.List<java.lang.String>>",
               getProvider(Key.get(new TypeLiteral<List<String>>() {})).toString());
 
-          assertEquals("AnnotatedBindingBuilder<java.lang.Integer>",
+          assertEquals("BindingBuilder<java.lang.Integer>",
               bind(Integer.class).toString());
-          assertEquals("LinkedBindingBuilder<java.lang.Integer>",
+          assertEquals("BindingBuilder<java.lang.Integer>",
               bind(Integer.class).annotatedWith(Names.named("a")).toString());
-          assertEquals("AnnotatedConstantBindingBuilder", bindConstant().toString());
+          assertEquals("ConstantBindingBuilder", bindConstant().toString());
           assertEquals("ConstantBindingBuilder",
               bindConstant().annotatedWith(Names.named("b")).toString());
+          assertEquals("AnnotatedElementBuilder",
+              binder().newPrivateBinder().expose(Integer.class).toString());
         }
       });
       fail();
diff --git a/test/com/google/inject/TypeConversionTest.java b/test/com/google/inject/TypeConversionTest.java
index 46cb910..0e2da83 100644
--- a/test/com/google/inject/TypeConversionTest.java
+++ b/test/com/google/inject/TypeConversionTest.java
@@ -23,6 +23,7 @@
 import java.lang.annotation.Retention;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 import java.util.Date;
+import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
 /**
@@ -279,6 +280,30 @@
           "at " + DateHolder.class.getName() + ".date(TypeConversionTest.java:");
     }
   }
+  
+  public void testStringIsConvertedOnlyOnce() {
+    final TypeConverter converter = new TypeConverter() {
+      boolean converted = false;
+      public Object convert(String value, TypeLiteral<?> toType) {
+        if (converted) {
+          throw new AssertionFailedError("converted multiple times!");
+        }
+        converted = true;
+        return new Date();
+      }
+    };
+
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        convertToTypes(Matchers.only(TypeLiteral.get(Date.class)), converter);
+        bindConstant().annotatedWith(NumericValue.class).to("unused");
+      }
+    });
+
+    Date first = injector.getInstance(Key.get(Date.class, NumericValue.class));
+    Date second = injector.getInstance(Key.get(Date.class, NumericValue.class));
+    assertSame(first, second);
+  }
 
   public void testAmbiguousTypeConversion() {
     Module module = new AbstractModule() {
diff --git a/test/com/google/inject/spi/ElementsTest.java b/test/com/google/inject/spi/ElementsTest.java
index 08bd863..49fb54e 100644
--- a/test/com/google/inject/spi/ElementsTest.java
+++ b/test/com/google/inject/spi/ElementsTest.java
@@ -150,6 +150,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(String.class, SampleAnnotation.class), command.getKey());
             assertEquals("A", getInstance(command));
             return null;
@@ -158,6 +159,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(String.class, Names.named("Bee")), command.getKey());
             assertEquals("B", getInstance(command));
             return null;
@@ -185,6 +187,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(String.class, Names.named("String")), command.getKey());
             assertEquals("A", getInstance(command));
             return null;
@@ -193,6 +196,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Integer.class, Names.named("int")), command.getKey());
             assertEquals(2, getInstance(command));
             return null;
@@ -201,6 +205,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Long.class, Names.named("long")), command.getKey());
             assertEquals(3L, getInstance(command));
             return null;
@@ -209,6 +214,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Boolean.class, Names.named("boolean")), command.getKey());
             assertEquals(false, getInstance(command));
             return null;
@@ -217,6 +223,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Double.class, Names.named("double")), command.getKey());
             assertEquals(5.0d, getInstance(command));
             return null;
@@ -225,6 +232,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Float.class, Names.named("float")), command.getKey());
             assertEquals(6.0f, getInstance(command));
             return null;
@@ -233,6 +241,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Short.class, Names.named("short")), command.getKey());
             assertEquals((short) 7, getInstance(command));
             return null;
@@ -241,6 +250,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Character.class, Names.named("char")), command.getKey());
             assertEquals('h', getInstance(command));
             return null;
@@ -249,6 +259,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(Class.class, Names.named("Class")), command.getKey());
             assertEquals(Iterator.class, getInstance(command));
             return null;
@@ -257,6 +268,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(CoinSide.class, Names.named("Enum")), command.getKey());
             assertEquals(CoinSide.TAILS, getInstance(command));
             return null;
@@ -346,11 +358,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof ProviderInstanceBinding);
             assertEquals(Key.get(String.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitProvider(Provider<? extends T> provider,
-                  Set<InjectionPoint> injectionPoints) {
-                assertSame(aProvider, provider);
+              @Override public Void visitProviderInstance(ProviderInstanceBinding<T> binding) {
+                assertSame(aProvider, binding.getProviderInstance());
                 return null;
               }
             });
@@ -360,10 +372,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof ProviderKeyBinding);
             assertEquals(Key.get(List.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
-                assertEquals(Key.get(ListProvider.class), providerKey);
+              @Override public Void visitProviderKey(ProviderKeyBinding<T> binding) {
+                assertEquals(Key.get(ListProvider.class), binding.getProviderKey());
                 return null;
               }
             });
@@ -373,10 +386,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof ProviderKeyBinding);
             assertEquals(Key.get(Collection.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitProviderKey(Key<? extends Provider<? extends T>> providerKey) {
-                assertEquals(Key.get(ListProvider.class), providerKey);
+              @Override public Void visitProviderKey(ProviderKeyBinding<T> binding) {
+                assertEquals(Key.get(ListProvider.class), binding.getProviderKey());
                 return null;
               }
             });
@@ -398,10 +412,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof LinkedKeyBinding);
             assertEquals(Key.get(List.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitKey(Key<? extends T> key) {
-                assertEquals(Key.get(ArrayList.class), key);
+              @Override public Void visitLinkedKey(LinkedKeyBinding<T> binding) {
+                assertEquals(Key.get(ArrayList.class), binding.getLinkedKey());
                 return null;
               }
             });
@@ -411,10 +426,12 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof LinkedKeyBinding);
             assertEquals(Key.get(Map.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitKey(Key<? extends T> key) {
-                assertEquals(Key.get(new TypeLiteral<HashMap<Integer, String>>() {}), key);
+              @Override public Void visitLinkedKey(LinkedKeyBinding<T> binding) {
+                assertEquals(Key.get(new TypeLiteral<HashMap<Integer, String>>() {}),
+                    binding.getLinkedKey());
                 return null;
               }
             });
@@ -424,10 +441,12 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof LinkedKeyBinding);
             assertEquals(Key.get(Set.class), command.getKey());
             command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              public Void visitKey(Key<? extends T> key) {
-                assertEquals(Key.get(TreeSet.class, SampleAnnotation.class), key);
+              @Override public Void visitLinkedKey(LinkedKeyBinding<T> binding) {
+                assertEquals(Key.get(TreeSet.class, SampleAnnotation.class),
+                    binding.getLinkedKey());
                 return null;
               }
             });
@@ -447,6 +466,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> command) {
+            assertTrue(command instanceof InstanceBinding);
             assertEquals(Key.get(String.class), command.getKey());
             assertEquals("A", getInstance(command));
             return null;
@@ -713,10 +733,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ExposedBinding);
             assertEquals(arrayList, binding.getKey());
             binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitExposed(PrivateEnvironment privateEnvironment) {
-                assertEquals(collections, privateEnvironment.getExposedKeys());
+              @Override public Void visitExposed(ExposedBinding<T> binding) {
+                assertEquals(collections, binding.getPrivateEnvironment().getExposedKeys());
                 return null;
               }
             });
@@ -726,10 +747,11 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ExposedBinding);
             assertEquals(collection, binding.getKey());
             binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitExposed(PrivateEnvironment privateEnvironment) {
-                assertEquals(collections, privateEnvironment.getExposedKeys());
+              @Override public Void visitExposed(ExposedBinding<T> binding) {
+                assertEquals(collections, binding.getPrivateEnvironment().getExposedKeys());
                 return null;
               }
             });
@@ -756,11 +778,12 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ExposedBinding);
             assertEquals(a, binding.getKey());
             assertEquals("2 ElementsTest.java", binding.getSource());
             binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitExposed(PrivateEnvironment privateEnvironment) {
-                assertEquals(ab, privateEnvironment.getExposedKeys());
+              @Override public Void visitExposed(ExposedBinding<T> binding) {
+                assertEquals(ab, binding.getPrivateEnvironment().getExposedKeys());
                 return null;
               }
             });
@@ -770,11 +793,12 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ExposedBinding);
             assertEquals(b, binding.getKey());
             assertEquals("2 ElementsTest.java", binding.getSource());
             binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitExposed(PrivateEnvironment privateEnvironment) {
-                assertEquals(ab, privateEnvironment.getExposedKeys());
+              @Override public Void visitExposed(ExposedBinding<T> binding) {
+                assertEquals(ab, binding.getPrivateEnvironment().getExposedKeys());
                 return null;
               }
             });
diff --git a/test/com/google/inject/spi/FailingTargetVisitor.java b/test/com/google/inject/spi/FailingTargetVisitor.java
index b646b52..543ffc8 100644
--- a/test/com/google/inject/spi/FailingTargetVisitor.java
+++ b/test/com/google/inject/spi/FailingTargetVisitor.java
@@ -16,10 +16,11 @@
 
 package com.google.inject.spi;
 
+import com.google.inject.Binding;
 import junit.framework.AssertionFailedError;
 
 public class FailingTargetVisitor<T> extends DefaultBindingTargetVisitor<T, Void> {
-  @Override protected Void visitOther() {
+  @Override protected Void visitOther(Binding<T> binding) {
     throw new AssertionFailedError();
   }
 }
diff --git a/test/com/google/inject/spi/HasDependenciesTest.java b/test/com/google/inject/spi/HasDependenciesTest.java
new file mode 100644
index 0000000..0c3cbec
--- /dev/null
+++ b/test/com/google/inject/spi/HasDependenciesTest.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (C) 2008 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.inject.spi;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import java.util.Set;
+import junit.framework.TestCase;
+
+/**
+ * @author jessewilson@google.com (Jesse Wilson)
+ */
+public class HasDependenciesTest extends TestCase {
+
+  /**
+   * When an instance implements HasDependencies, the injected dependencies aren't used.
+   */
+  public void testInstanceWithDependencies() {
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        bind(A.class).toInstance(new AWithDependencies());
+      }
+    });
+
+    InstanceBinding<?> binding = (InstanceBinding<?>) injector.getBinding(A.class);
+    assertEquals(ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Integer.class))),
+        binding.getDependencies());
+  }
+
+  public void testInstanceWithoutDependencies() {
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        bind(A.class).toInstance(new A());
+      }
+    });
+
+    InstanceBinding<?> binding = (InstanceBinding<?>) injector.getBinding(A.class);
+    Dependency<?> onlyDependency = Iterables.getOnlyElement(binding.getDependencies());
+    assertEquals(Key.get(String.class), onlyDependency.getKey());
+  }
+
+  public void testProvider() {
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        bind(A.class).toProvider(new ProviderOfA());
+      }
+    });
+
+    ProviderInstanceBinding<?> binding = (ProviderInstanceBinding<?>) injector.getBinding(A.class);
+    Dependency<?> onlyDependency = Iterables.getOnlyElement(binding.getDependencies());
+    assertEquals(Key.get(String.class), onlyDependency.getKey());
+  }
+
+  static class A {
+    @Inject void injectUnusedDependencies(String unused) {}
+  }
+
+  static class ProviderOfA implements Provider<A> {
+    @Inject void injectUnusedDependencies(String unused) {}
+
+    public A get() {
+      throw new UnsupportedOperationException();
+    }
+  }
+
+  static class AWithDependencies extends A implements HasDependencies {
+    public Set<Dependency<?>> getDependencies() {
+      return ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Integer.class)));
+    }
+  }
+
+  static class ProviderOfAWithDependencies
+      extends ProviderOfA implements ProviderWithDependencies<A> {
+    public Set<Dependency<?>> getDependencies() {
+      return ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Integer.class)));
+    }
+  }
+}
diff --git a/test/com/google/inject/spi/ProviderMethodsTest.java b/test/com/google/inject/spi/ProviderMethodsTest.java
index dda600a..f2d5d9b 100644
--- a/test/com/google/inject/spi/ProviderMethodsTest.java
+++ b/test/com/google/inject/spi/ProviderMethodsTest.java
@@ -300,4 +300,22 @@
     @Inject List<? super Integer> numbers;
     @Inject Class<?> type;
   }
+
+  public void testProviderMethodDependenciesAreExposed() {
+    Injector injector = Guice.createInjector(new AbstractModule() {
+      protected void configure() {
+        bind(Integer.class).toInstance(50);
+        bindConstant().annotatedWith(Names.named("units")).to("Kg");
+      }
+      @Provides @Named("weight") String provideWeight(Integer count, @Named("units") String units) {
+        return count + units;
+      }
+    });
+
+    ProviderInstanceBinding<?> binding = (ProviderInstanceBinding<?>) injector.getBinding(
+        Key.get(String.class, Names.named("weight")));
+    assertEquals(ImmutableSet.<Dependency<?>>of(Dependency.get(Key.get(Integer.class)),
+        Dependency.get(Key.get(String.class, Names.named("units")))),
+        binding.getDependencies());
+  }
 }
\ No newline at end of file
diff --git a/test/com/google/inject/spi/SpiBindingsTest.java b/test/com/google/inject/spi/SpiBindingsTest.java
index 5da78c3..2c29cf4 100644
--- a/test/com/google/inject/spi/SpiBindingsTest.java
+++ b/test/com/google/inject/spi/SpiBindingsTest.java
@@ -38,7 +38,6 @@
 import com.google.inject.name.Names;
 import java.lang.reflect.Constructor;
 import java.util.List;
-import java.util.Set;
 import java.util.logging.Logger;
 import junit.framework.TestCase;
 
@@ -57,6 +56,7 @@
 
         new FailingElementVisitor() {
           @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof InstanceBinding);
             assertEquals(Key.get(Integer.class, Names.named("one")), binding.getKey());
             return null;
           }
@@ -73,12 +73,13 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(Key.get(String.class), command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitInstance(T instance, Set<InjectionPoint> injectionPoints) {
-                assertEquals("A", instance);
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof InstanceBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(Key.get(String.class), binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitInstance(InstanceBinding<T> binding) {
+                assertEquals("A", binding.getInstance());
                 return null;
               }
             });
@@ -99,13 +100,13 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(Key.get(String.class), command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitProvider(Provider<? extends T> provider,
-                  Set<InjectionPoint> injectionPoints) {
-                assertSame(stringProvider, provider);
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ProviderInstanceBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(Key.get(String.class), binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitProviderInstance(ProviderInstanceBinding<T> binding) {
+                assertSame(stringProvider, binding.getProviderInstance());
                 return null;
               }
             });
@@ -124,12 +125,13 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(Key.get(String.class), command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitProviderKey(Key<? extends Provider<? extends T>> key) {
-                assertEquals(Key.get(StringProvider.class), key);
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ProviderKeyBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(Key.get(String.class), binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitProviderKey(ProviderKeyBinding<T> binding) {
+                assertEquals(Key.get(StringProvider.class), binding.getProviderKey());
                 return null;
               }
             });
@@ -152,12 +154,13 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(aKey, command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitKey(Key<? extends T> key) {
-                assertEquals(bKey, key);
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof LinkedKeyBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(aKey, binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitLinkedKey(LinkedKeyBinding<T> binding) {
+                assertEquals(bKey, binding.getLinkedKey());
                 return null;
               }
             });
@@ -166,8 +169,8 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertEquals(bKey, command.getKey());
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertEquals(bKey, binding.getKey());
             return null;
           }
         }
@@ -183,14 +186,14 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(Key.get(D.class), command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitConstructor(Constructor<? extends T> constructor,
-                  Set<InjectionPoint> injectionPoints) {
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof ConstructorBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(Key.get(D.class), binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitConstructor(ConstructorBinding<T> binding) {
                 Constructor<?> expected = D.class.getDeclaredConstructors()[0];
-                assertEquals(expected, constructor);
+                assertEquals(expected, binding.getConstructor());
                 return null;
               }
             });
@@ -209,12 +212,13 @@
         },
 
         new FailingElementVisitor() {
-          @Override public <T> Void visitBinding(Binding<T> command) {
-            assertContains(command.getSource().toString(), "SpiBindingsTest.java");
-            assertEquals(Key.get(Integer.class, Names.named("one")), command.getKey());
-            command.acceptTargetVisitor(new FailingTargetVisitor<T>() {
-              @Override public Void visitInstance(T instance, Set<InjectionPoint> injectionPoints) {
-                assertEquals((Integer) 1, instance);
+          @Override public <T> Void visitBinding(Binding<T> binding) {
+            assertTrue(binding instanceof InstanceBinding);
+            assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+            assertEquals(Key.get(Integer.class, Names.named("one")), binding.getKey());
+            binding.acceptTargetVisitor(new FailingTargetVisitor<T>() {
+              @Override public Void visitInstance(InstanceBinding<T> binding) {
+                assertEquals(1, binding.getInstance());
                 return null;
               }
             });
@@ -234,9 +238,10 @@
     Binding<Integer> binding = injector.getBinding(Key.get(Integer.class, Names.named("one")));
     assertEquals(Key.get(Integer.class, Names.named("one")), binding.getKey());
     assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+    assertTrue(binding instanceof ConvertedConstantBinding);
     binding.acceptTargetVisitor(new FailingTargetVisitor<Integer>() {
-      @Override public Void visitConvertedConstant(Integer value) {
-        assertEquals((Integer) 1, value);
+      @Override public Void visitConvertedConstant(ConvertedConstantBinding<Integer> binding) {
+        assertEquals((Integer) 1, binding.getValue());
         return null;
       }
     });
@@ -253,9 +258,10 @@
     Binding<Provider<String>> binding = injector.getBinding(providerOfStringKey);
     assertEquals(providerOfStringKey, binding.getKey());
     assertContains(binding.getSource().toString(), "SpiBindingsTest.java");
+    assertTrue(binding instanceof ProviderBinding);
     binding.acceptTargetVisitor(new FailingTargetVisitor<Provider<String>>() {
-      @Override public Void visitProviderBinding(Key<?> provided) {
-        assertEquals(Key.get(String.class), provided);
+      @Override public Void visitProviderBinding(ProviderBinding<?> binding) {
+        assertEquals(Key.get(String.class), binding.getProvidedKey());
         return null;
       }
     });
