diff --git a/src/com/google/inject/BoundProviderFactory.java b/src/com/google/inject/BoundProviderFactory.java
index f39e8ae..3cbfc11 100644
--- a/src/com/google/inject/BoundProviderFactory.java
+++ b/src/com/google/inject/BoundProviderFactory.java
@@ -37,15 +37,6 @@
     this.source = source;
   }
 
-  BoundProviderFactory(
-      Key<? extends Provider<? extends T>> providerKey,
-      InternalFactory<? extends Provider<? extends T>> providerFactory,
-      Object source) {
-    this.providerKey = providerKey;
-    this.providerFactory = providerFactory;
-    this.source = source;
-  }
-
   public void notify(final InjectorImpl injector) {
     injector.withDefaultSource(source, new Runnable() {
       public void run() {
@@ -58,10 +49,6 @@
     });
   }
 
-  public String toString() {
-    return providerKey.toString();
-  }
-
   public T get(InternalContext context, InjectionPoint<?> injectionPoint) {
     Provider<? extends T> provider = providerFactory.get(context, injectionPoint);
     try {
@@ -72,4 +59,8 @@
       throw new ProvisionException(e, ErrorMessages.ERROR_IN_PROVIDER);
     }
   }
+
+  @Override public String toString() {
+    return providerKey.toString();
+  }
 }
diff --git a/src/com/google/inject/ClassBindingImpl.java b/src/com/google/inject/ClassBindingImpl.java
index 65cdf30..36fb272 100644
--- a/src/com/google/inject/ClassBindingImpl.java
+++ b/src/com/google/inject/ClassBindingImpl.java
@@ -73,8 +73,7 @@
     return injectors;
   }
 
-  @Override
-  public String toString() {
+  @Override public String toString() {
     return new ToStringBuilder(ClassBinding.class)
         .add("class", getBoundClass())
         .add("scope", scope)
diff --git a/src/com/google/inject/ConfigurationException.java b/src/com/google/inject/ConfigurationException.java
index d73ebd5..6e0dd09 100644
--- a/src/com/google/inject/ConfigurationException.java
+++ b/src/com/google/inject/ConfigurationException.java
@@ -26,12 +26,4 @@
   ConfigurationException(String message) {
     super(message);
   }
-
-  ConfigurationException(String message, Throwable cause) {
-    super(message, cause);
-  }
-
-  ConfigurationException(Throwable cause) {
-    super(cause);
-  }
 }
diff --git a/src/com/google/inject/ConstructorInjector.java b/src/com/google/inject/ConstructorInjector.java
index b501a41..32732d5 100644
--- a/src/com/google/inject/ConstructorInjector.java
+++ b/src/com/google/inject/ConstructorInjector.java
@@ -16,10 +16,13 @@
 
 package com.google.inject;
 
+import com.google.inject.InjectorImpl.SingleMemberInjector;
+import com.google.inject.InjectorImpl.SingleParameterInjector;
 import com.google.inject.internal.ErrorMessages;
 import com.google.inject.internal.ResolveFailedException;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.List;
 
 /**
  * Injects constructors.
@@ -29,29 +32,20 @@
 class ConstructorInjector<T> {
 
   final Class<T> implementation;
-  final InjectorImpl.SingleMemberInjector[] memberInjectors;
-  final InjectorImpl.SingleParameterInjector<?>[] parameterInjectors;
+  final SingleMemberInjector[] memberInjectors;
+  final SingleParameterInjector<?>[] parameterInjectors;
   final ConstructionProxy<T> constructionProxy;
 
   ConstructorInjector(InjectorImpl injector, Class<T> implementation) {
     this.implementation = implementation;
     constructionProxy = injector.reflection.getConstructionProxy(implementation);
     parameterInjectors = createParameterInjector(injector, constructionProxy);
-    memberInjectors = injector.injectors.get(implementation)
-        .toArray(new InjectorImpl.SingleMemberInjector[0]);
+    List<SingleMemberInjector> memberInjectorsList = injector.injectors.get(implementation);
+    memberInjectors = memberInjectorsList.toArray(
+        new SingleMemberInjector[memberInjectorsList.size()]);
   }
 
-  /**
-   * Used to create an invalid injector.
-   */
-  private ConstructorInjector() {
-    implementation = null;
-    memberInjectors = null;
-    parameterInjectors = null;
-    constructionProxy = null;
-  }
-
-  InjectorImpl.SingleParameterInjector<?>[] createParameterInjector(
+  SingleParameterInjector<?>[] createParameterInjector(
       InjectorImpl injector, ConstructionProxy<T> constructionProxy) {
     try {
       return constructionProxy.getParameters().isEmpty()
@@ -121,19 +115,4 @@
       constructionContext.removeCurrentReference();
     }
   }
-
-  /**
-   * Returns an invalid constructor. This enables us to keep running and
-   * reporting legitimate errors.
-   */
-  static <T> ConstructorInjector<T> invalidConstructor() {
-    return new ConstructorInjector<T>() {
-      Object construct(InternalContext context, Class<?> expectedType) {
-        throw new UnsupportedOperationException();
-      }
-      public T get() {
-        throw new UnsupportedOperationException();
-      }
-    };
-  }
 }
diff --git a/src/com/google/inject/InjectionPoint.java b/src/com/google/inject/InjectionPoint.java
index b663aa9..7e363da 100644
--- a/src/com/google/inject/InjectionPoint.java
+++ b/src/com/google/inject/InjectionPoint.java
@@ -84,7 +84,7 @@
 
   <T> T checkForNull(T value, Object source) {
     if (value != null
-        || getNullability() == Nullability.NULLABLE
+        || allowsNull()
         || allowNullsBadBadBad()) {
       return value;
     }
diff --git a/src/com/google/inject/InvalidBindingImpl.java b/src/com/google/inject/InvalidBindingImpl.java
index a833143..f2213b1 100644
--- a/src/com/google/inject/InvalidBindingImpl.java
+++ b/src/com/google/inject/InvalidBindingImpl.java
@@ -32,7 +32,7 @@
     throw new AssertionError();
   }
 
-  public String toString() {
+  @Override public String toString() {
     return "InvalidBinding";
   }
 }
diff --git a/src/com/google/inject/LinkedBindingImpl.java b/src/com/google/inject/LinkedBindingImpl.java
index 4bebbc8..3693fd9 100644
--- a/src/com/google/inject/LinkedBindingImpl.java
+++ b/src/com/google/inject/LinkedBindingImpl.java
@@ -16,9 +16,9 @@
 
 package com.google.inject;
 
-import com.google.inject.spi.LinkedBinding;
-import com.google.inject.spi.BindingVisitor;
 import com.google.inject.internal.ToStringBuilder;
+import com.google.inject.spi.BindingVisitor;
+import com.google.inject.spi.LinkedBinding;
 
 /**
  *
@@ -44,8 +44,7 @@
     return injector.getBinding(targetKey);
   }
 
-  @Override
-  public String toString() {
+  @Override public String toString() {
     return new ToStringBuilder(LinkedBinding.class)
         .add("key", key)
         .add("target", targetKey)
diff --git a/src/com/google/inject/LinkedProviderBindingImpl.java b/src/com/google/inject/LinkedProviderBindingImpl.java
index c74881b..15f6a71 100644
--- a/src/com/google/inject/LinkedProviderBindingImpl.java
+++ b/src/com/google/inject/LinkedProviderBindingImpl.java
@@ -16,9 +16,9 @@
 
 package com.google.inject;
 
-import com.google.inject.spi.LinkedProviderBinding;
-import com.google.inject.spi.BindingVisitor;
 import com.google.inject.internal.ToStringBuilder;
+import com.google.inject.spi.BindingVisitor;
+import com.google.inject.spi.LinkedProviderBinding;
 
 /**
  *
@@ -44,8 +44,7 @@
     return injector.getBinding(providerKey);
   }
 
-  @Override
-  public String toString() {
+  @Override public String toString() {
     return new ToStringBuilder(LinkedProviderBinding.class)
         .add("key", key)
         .add("provider", providerKey)
diff --git a/src/com/google/inject/Parameter.java b/src/com/google/inject/Parameter.java
index b43329e..d088b4a 100644
--- a/src/com/google/inject/Parameter.java
+++ b/src/com/google/inject/Parameter.java
@@ -19,7 +19,6 @@
 
 import com.google.inject.internal.ErrorHandler;
 import com.google.inject.internal.Keys;
-import net.sf.cglib.reflect.FastConstructor;
 
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Constructor;
@@ -74,11 +73,6 @@
         constructor.getParameterAnnotations());
   }
 
-  public static List<Parameter<?>> forConstructor(
-      ErrorHandler errorHandler, FastConstructor constructor) {
-    return forConstructor(errorHandler, constructor.getJavaConstructor());
-  }
-
   private static List<Parameter<?>> forMember(ErrorHandler errorHandler, Member member,
       Type[] genericParameterTypes, Annotation[][] annotations) {
     Iterator<Annotation[]> annotationsIterator = Arrays.asList(annotations).iterator();
diff --git a/src/com/google/inject/Scopes.java b/src/com/google/inject/Scopes.java
index a5c2699..bb1eff4 100644
--- a/src/com/google/inject/Scopes.java
+++ b/src/com/google/inject/Scopes.java
@@ -16,9 +16,9 @@
 
 package com.google.inject;
 
-import com.google.inject.internal.StackTraceElements;
 import com.google.inject.internal.ErrorHandler;
 import com.google.inject.internal.ErrorMessages;
+import com.google.inject.internal.StackTraceElements;
 
 import java.lang.annotation.Annotation;
 import java.util.Map;
@@ -66,7 +66,7 @@
       };
     }
 
-    public String toString() {
+    @Override public String toString() {
       return "Scopes.SINGLETON";
     }
   };
@@ -85,7 +85,7 @@
     public <T> Provider<T> scope(Key<T> key, Provider<T> unscoped) {
       return unscoped;
     }
-    public String toString() {
+    @Override public String toString() {
       return "Scopes.NO_SCOPE";
     }
   };
diff --git a/src/com/google/inject/internal/ReferenceCache.java b/src/com/google/inject/internal/ReferenceCache.java
index 85b3285..44bfc2f 100644
--- a/src/com/google/inject/internal/ReferenceCache.java
+++ b/src/com/google/inject/internal/ReferenceCache.java
@@ -61,7 +61,7 @@
       ReferenceType keyReferenceType,
       ReferenceType valueReferenceType,
       final Function<? super K, ? extends V> function) {
-    ensureNotNull(function);
+    Objects.nonNull(function, "function");
     return new ReferenceCache<K, V>(keyReferenceType, valueReferenceType) {
       protected V create(K key) {
         return function.apply(key);
diff --git a/src/com/google/inject/internal/ReferenceMap.java b/src/com/google/inject/internal/ReferenceMap.java
index 515607f..1fa17c4 100644
--- a/src/com/google/inject/internal/ReferenceMap.java
+++ b/src/com/google/inject/internal/ReferenceMap.java
@@ -23,12 +23,7 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.lang.ref.Reference;
-import java.util.AbstractMap;
-import java.util.AbstractSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -83,7 +78,7 @@
   }
 
   public V get(final Object key) {
-    ensureNotNull(key);
+    Objects.nonNull(key, "key");
     return internalGet((K) key);
   }
 
@@ -100,7 +95,7 @@
   }
 
   public V remove(Object key) {
-    ensureNotNull(key);
+    Objects.nonNull(key, "key");
     Object referenceAwareKey = makeKeyReferenceAware(key);
     Object valueReference = delegate.remove(referenceAwareKey);
     return dereferenceValue(valueReference);
@@ -115,13 +110,13 @@
   }
 
   public boolean containsKey(Object key) {
-    ensureNotNull(key);
+    Objects.nonNull(key, "key");
     Object referenceAwareKey = makeKeyReferenceAware(key);
     return delegate.containsKey(referenceAwareKey);
   }
 
   public boolean containsValue(Object value) {
-    ensureNotNull(value);
+    Objects.nonNull(value, "value");
     for (Object valueReference : delegate.values()) {
       if (value.equals(dereferenceValue(valueReference))) {
         return true;
@@ -318,11 +313,11 @@
       return wrapped;
     }
 
-    public int hashCode() {
+    @Override public int hashCode() {
       return wrapped.hashCode();
     }
 
-    public boolean equals(Object obj) {
+    @Override public boolean equals(Object obj) {
       // defer to reference's equals() logic.
       return obj.equals(this);
     }
@@ -603,13 +598,6 @@
     public void clear() {
       delegate.clear();
     }
-  };
-
-  // TODO(kevinb): use preconditions
-  static void ensureNotNull(Object o) {
-    if (o == null) {
-      throw new NullPointerException();
-    }
   }
 
   static void ensureNotNull(Object... array) {
diff --git a/src/com/google/inject/internal/ReferenceType.java b/src/com/google/inject/internal/ReferenceType.java
index 966d757..671dbc0 100644
--- a/src/com/google/inject/internal/ReferenceType.java
+++ b/src/com/google/inject/internal/ReferenceType.java
@@ -51,5 +51,5 @@
    *
    * @see java.lang.ref.PhantomReference
    */
-  PHANTOM;
+  PHANTOM
 }
diff --git a/src/com/google/inject/internal/Strings.java b/src/com/google/inject/internal/Strings.java
index e9626cf..5b9167b 100644
--- a/src/com/google/inject/internal/Strings.java
+++ b/src/com/google/inject/internal/Strings.java
@@ -22,6 +22,7 @@
  * @author crazybob@google.com (Bob Lee)
  */
 public class Strings {
+  private Strings() {}
 
   /**
    * Returns a string that is equivalent to the specified string with its
@@ -44,8 +45,9 @@
    * @throws NullPointerException if <tt>s</tt> is null
    */
   public static String capitalize(String s) {
-    if (s.length() == 0)
+    if (s.length() == 0) {
       return s;
+    }
     char first = s.charAt(0);
     char capitalized = Character.toUpperCase(first);
     return (first == capitalized)
diff --git a/src/com/google/inject/internal/ToStringBuilder.java b/src/com/google/inject/internal/ToStringBuilder.java
index cdc62b9..0d00776 100644
--- a/src/com/google/inject/internal/ToStringBuilder.java
+++ b/src/com/google/inject/internal/ToStringBuilder.java
@@ -46,7 +46,7 @@
     return this;
   }
 
-  public String toString() {
+  @Override public String toString() {
     return name + map.toString().replace('{', '[').replace('}', ']');
   }
 }
diff --git a/src/com/google/inject/internal/UniqueAnnotations.java b/src/com/google/inject/internal/UniqueAnnotations.java
index 4fff62b..8fdab6e 100644
--- a/src/com/google/inject/internal/UniqueAnnotations.java
+++ b/src/com/google/inject/internal/UniqueAnnotations.java
@@ -27,6 +27,7 @@
  * @author jessewilson@google.com (Jesse Wilson)
  */
 public class UniqueAnnotations {
+  private UniqueAnnotations() {}
   private static final AtomicInteger nextUniqueValue = new AtomicInteger(1);
 
   /**
