diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java
index a212d59..7225e63 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsniRefLookup.java
@@ -183,7 +183,8 @@
    */
   private static void findMostDerivedMembers(
       LinkedHashMap<String, LinkedHashMap<String, HasEnclosingType>> matchesBySig,
-      JDeclaredType targetType, String memberName, boolean addConstructors) {
+      JDeclaredType targetType, String memberName,
+      boolean addConstructorsAndPrivates) {
     /*
      * Analyze superclasses and interfaces first. More derived members will thus
      * be seen later.
@@ -202,10 +203,16 @@
     // Get the methods on this class/interface.
     for (JMethod method : targetType.getMethods()) {
       if (method.getName().equals(memberName)) {
-        if (addConstructors || !method.getName().equals(JsniRef.NEW)) {
-          addMember(matchesBySig, method, getJsniSignature(method, false));
-          addMember(matchesBySig, method, getJsniSignature(method, true));
+        if (!addConstructorsAndPrivates) {
+          if (method.getName().equals(JsniRef.NEW)) {
+            continue;
+          }
+          if (method.isPrivate()) {
+            continue;
+          }
         }
+        addMember(matchesBySig, method, getJsniSignature(method, false));
+        addMember(matchesBySig, method, getJsniSignature(method, true));
       }
     }
 
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java
index ad63932..e394d54 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsniRefLookupTest.java
@@ -124,10 +124,39 @@
       }
     });
 
+    sourceOracle.addOrReplace(new MockJavaResource("test.PrivateSup") {
+      @Override
+      protected CharSequence getContent() {
+        StringBuffer code = new StringBuffer();
+        code.append("package test;\n");
+        code.append("public class PrivateSup {\n");
+        code.append("  private static int field;\n");
+        code.append("  private static int method() { return 0; }\n");
+        code.append("  private static int fieldSup;\n");
+        code.append("  private static int methodSuP() { return 0; }\n");
+        code.append("}\n");
+        return code;
+      }
+    });
+
+    sourceOracle.addOrReplace(new MockJavaResource("test.PrivateSub") {
+      @Override
+      protected CharSequence getContent() {
+        StringBuffer code = new StringBuffer();
+        code.append("package test;\n");
+        code.append("public class PrivateSub extends PrivateSup {\n");
+        code.append("  private static float field;\n");
+        code.append("  private static float method() { return 0; }\n");
+        code.append("  private static float methodSub() { return 0; }\n");
+        code.append("}\n");
+        return code;
+      }
+    });
+
     try {
       // The snippet must reference the classes so they will be compiled in
       program = compileSnippet("void",
-          "new test.Foo(); new test.Bar(); new ClassWithBridge();");
+          "new test.Foo(); new test.Bar(); new ClassWithBridge(); new PrivateSub();");
     } catch (UnableToCompleteException e) {
       throw new RuntimeException(e);
     }
@@ -401,6 +430,36 @@
     }
   }
 
+  public void testPrivate() {
+    // test private entries in the requested class
+    {
+      MockErrorReporter errors = new MockErrorReporter();
+      JMethod res = (JMethod) lookup("test.PrivateSub::method()", errors);
+      errors.assertNoError();
+      assertEquals("test.PrivateSub", res.getEnclosingType().getName());
+      assertEquals("method", res.getName());
+    }
+    {
+      MockErrorReporter errors = new MockErrorReporter();
+      JField res = (JField) lookup("test.PrivateSub::field", errors);
+      errors.assertNoError();
+      assertEquals("test.PrivateSub", res.getEnclosingType().getName());
+      assertEquals("field", res.getName());
+    }
+    
+    // test private entries in the superclass
+    {
+      MockErrorReporter errors = new MockErrorReporter();
+      JMethod res = (JMethod) lookup("test.PrivateSub::methodSup()", errors);
+      errors.assertHasError();
+    }
+    {
+      MockErrorReporter errors = new MockErrorReporter();
+      JField res = (JField) lookup("test.PrivateSub::fieldSup", errors);
+      errors.assertHasError();
+    }
+  }
+
   public void testWildcardLookups() {
     {
       MockErrorReporter errors = new MockErrorReporter();
