diff --git a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
index f04627a..87dd845 100644
--- a/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
+++ b/dev/core/src/com/google/gwt/dev/javac/JsInteropUtil.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.dev.javac;
 
+import com.google.gwt.dev.jjs.ast.HasJsInfo.JsMemberType;
 import com.google.gwt.dev.jjs.ast.JClassType;
 import com.google.gwt.dev.jjs.ast.JConstructor;
 import com.google.gwt.dev.jjs.ast.JDeclaredType;
@@ -22,9 +23,7 @@
 import com.google.gwt.dev.jjs.ast.JInterfaceType;
 import com.google.gwt.dev.jjs.ast.JMember;
 import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethod.JsPropertyAccessorType;
 import com.google.gwt.dev.jjs.ast.JPrimitiveType;
-import com.google.gwt.thirdparty.guava.common.base.Strings;
 
 import org.eclipse.jdt.internal.compiler.ast.Annotation;
 import org.eclipse.jdt.internal.compiler.lookup.AnnotationBinding;
@@ -46,7 +45,7 @@
   public static void maybeSetJsInteropProperties(JDeclaredType type, Annotation... annotations) {
     AnnotationBinding jsType = JdtUtil.getAnnotation(annotations, JSTYPE_CLASS);
     String namespace = maybeGetJsNamespace(annotations);
-    String exportName = maybeGetJsExportName(annotations, "");
+    String exportName = maybeGetJsExportName(annotations);
     String jsPrototype = JdtUtil.getAnnotationParameterString(jsType, "prototype");
     boolean isJsNative = jsPrototype != null;
     if (isJsNative) {
@@ -55,7 +54,7 @@
       exportName = jsPrototype.substring(indexOf + 1);
     }
     boolean isJsType = jsType != null;
-    boolean isClassWideExport = exportName != null;
+    boolean isClassWideExport = JdtUtil.getAnnotation(annotations, JSEXPORT_CLASS) != null;
     boolean isJsFunction = JdtUtil.getAnnotation(annotations, JSFUNCTION_CLASS) != null;
     boolean canBeImplementedExternally =
         (type instanceof JInterfaceType && (isJsType || isJsFunction))
@@ -84,61 +83,60 @@
   }
 
   public static void maybeSetJsInteropProperties(JMethod method, Annotation... annotations) {
-    setJsInteropProperties(method, annotations);
-    if (JdtUtil.getAnnotation(annotations, JSPROPERTY_CLASS) != null) {
-      setJsPropertyProperties(method, null);
-    }
+    boolean isPropertyAccessor = JdtUtil.getAnnotation(annotations, JSPROPERTY_CLASS) != null;
+    setJsInteropProperties(method, annotations, isPropertyAccessor);
   }
 
   public static void maybeSetJsInteropPropertiesNew(JMethod method, Annotation... annotations) {
-    AnnotationBinding annotation = getInteropAnnotation(annotations, "JsMethod");
     if (getInteropAnnotation(annotations, "JsOverlay") != null) {
       method.setJsOverlay();
     }
 
+    AnnotationBinding annotation = getInteropAnnotation(annotations, "JsMethod");
     if (annotation == null) {
       annotation = getInteropAnnotation(annotations, "JsConstructor");
     }
-    AnnotationBinding jsPropertyAnnotation = getInteropAnnotation(annotations, "JsProperty");
     if (annotation == null) {
-      annotation = jsPropertyAnnotation;
+      annotation = getInteropAnnotation(annotations, "JsProperty");
     }
-    setJsInteropPropertiesNew(method, annotations, annotation);
-    if (jsPropertyAnnotation != null) {
-      setJsPropertyProperties(
-          method, JdtUtil.getAnnotationParameterString(jsPropertyAnnotation, "name"));
-    }
+
+    boolean isPropertyAccessor = getInteropAnnotation(annotations, "JsProperty") != null;
+    setJsInteropPropertiesNew(method, annotations, annotation, isPropertyAccessor);
   }
 
   public static void maybeSetJsInteropProperties(JField field, Annotation... annotations) {
-    setJsInteropProperties(field, annotations);
+    setJsInteropProperties(field, annotations, false);
   }
 
   public static void maybeSetJsInteropPropertiesNew(JField field, Annotation... annotations) {
     AnnotationBinding annotation = getInteropAnnotation(annotations, "JsProperty");
-    setJsInteropPropertiesNew(field, annotations, annotation);
+    setJsInteropPropertiesNew(field, annotations, annotation, false);
   }
 
-  private static void setJsInteropProperties(JMember member, Annotation... annotations) {
-    String namespace = maybeGetJsNamespace(annotations);
-    String exportName = maybeGetJsExportName(annotations, computeName(member));
-    member.setJsMemberInfo(namespace, exportName, exportName != null);
+  private static void setJsInteropProperties(
+      JMember member, Annotation[] annotations, boolean isPropertyAccessor) {
+    boolean hasExport = JdtUtil.getAnnotation(annotations, JSEXPORT_CLASS) != null;
 
     /* Apply class wide JsInterop annotations */
 
     boolean ignore = JdtUtil.getAnnotation(annotations, JSNOEXPORT_CLASS) != null;
-    if (ignore || (!member.isPublic() && !isNativeConstructor(member)) || exportName != null) {
+    if (ignore || (!member.isPublic() && !isNativeConstructor(member)) || !hasExport) {
       return;
     }
 
+    String namespace = maybeGetJsNamespace(annotations);
+    String exportName = maybeGetJsExportName(annotations);
+    JsMemberType memberType = getJsMemberType(member, isPropertyAccessor);
+    member.setJsMemberInfo(memberType, namespace, exportName, hasExport);
+
     JDeclaredType enclosingType = member.getEnclosingType();
 
     if (enclosingType.isJsType() && member.needsDynamicDispatch()) {
-      member.setJsMemberInfo(namespace, computeName(member), true);
+      member.setJsMemberInfo(memberType, namespace, exportName, true);
     }
 
     if (enclosingType.isClassWideExport() && !member.needsDynamicDispatch()) {
-      member.setJsMemberInfo(namespace, computeName(member), true);
+      member.setJsMemberInfo(memberType, namespace, exportName, true);
     }
   }
 
@@ -146,8 +144,8 @@
     return member instanceof JConstructor && member.getEnclosingType().isJsNative();
   }
 
-  private static void setJsInteropPropertiesNew(
-      JMember member, Annotation[] annotations, AnnotationBinding memberAnnotation) {
+  private static void setJsInteropPropertiesNew(JMember member, Annotation[] annotations,
+      AnnotationBinding memberAnnotation, boolean isAccessor) {
     if (getInteropAnnotation(annotations, "JsIgnore") != null) {
       return;
     }
@@ -159,38 +157,43 @@
 
     String namespace = JdtUtil.getAnnotationParameterString(memberAnnotation, "namespace");
     String name = JdtUtil.getAnnotationParameterString(memberAnnotation, "name");
-    member.setJsMemberInfo(namespace, name == null ? computeName(member) : name, true);
+    JsMemberType memberType = getJsMemberType(member, isAccessor);
+    member.setJsMemberInfo(memberType, namespace, name, true);
   }
 
-  private static void setJsPropertyProperties(JMethod method, String name) {
-    if (method.getParams().size() == 1 && method.getType() == JPrimitiveType.VOID) {
-      method.setJsPropertyInfo(name, JsPropertyAccessorType.SETTER);
-    } else if (method.getParams().isEmpty() && method.getType() != JPrimitiveType.VOID) {
-      method.setJsPropertyInfo(name, JsPropertyAccessorType.GETTER);
-    } else {
-      method.setJsPropertyInfo(name, JsPropertyAccessorType.UNDEFINED);
+  private static JsMemberType getJsMemberType(JMember member, boolean isPropertyAccessor) {
+    if (member instanceof JField) {
+      return JsMemberType.PROPERTY;
     }
+    if (member instanceof JConstructor) {
+      return JsMemberType.CONSTRUCTOR;
+    }
+    if (isPropertyAccessor) {
+      return getJsPropertyAccessorType((JMethod) member);
+    }
+    return JsMemberType.METHOD;
+  }
+
+  private static JsMemberType getJsPropertyAccessorType(JMethod method) {
+    if (method.getParams().size() == 1 && method.getType() == JPrimitiveType.VOID) {
+      return JsMemberType.SETTER;
+    } else if (method.getParams().isEmpty() && method.getType() != JPrimitiveType.VOID) {
+      return JsMemberType.GETTER;
+    }
+    return JsMemberType.UNDEFINED_ACCESSOR;
   }
 
   private static AnnotationBinding getInteropAnnotation(Annotation[] annotations, String name) {
     return JdtUtil.getAnnotation(annotations, "jsinterop.annotations." + name);
   }
 
-  private static String computeName(JMember member) {
-    return member instanceof JConstructor ? "" : member.getName();
-  }
-
   private static String maybeGetJsNamespace(Annotation[] annotations) {
     AnnotationBinding jsNamespace = JdtUtil.getAnnotation(annotations, JSNAMESPACE_CLASS);
     return JdtUtil.getAnnotationParameterString(jsNamespace, "value");
   }
 
-  private static String maybeGetJsExportName(Annotation[] annotations, String calculatedName) {
-    AnnotationBinding jsExport = JdtUtil.getAnnotation(annotations, JSEXPORT_CLASS);
-    if (jsExport == null) {
-      return null;
-    }
-    String value = JdtUtil.getAnnotationParameterString(jsExport, "value");
-    return Strings.isNullOrEmpty(value) ? calculatedName : value;
+  private static String maybeGetJsExportName(Annotation[] annotations) {
+    AnnotationBinding annotation = JdtUtil.getAnnotation(annotations, JSEXPORT_CLASS);
+    return JdtUtil.getAnnotationParameterString(annotation, "value");
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java b/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
index a799f33..75f6b6a 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/HasJsInfo.java
@@ -15,14 +15,116 @@
  */
 package com.google.gwt.dev.jjs.ast;
 
+import com.google.gwt.dev.javac.JsInteropUtil;
+
+import java.beans.Introspector;
+
 /**
  * Abstracts JsInterop information for the AST nodes.
  */
 public interface HasJsInfo extends HasJsName {
+  /**
+   * Indicates type of JsMember.
+   */
+  enum JsMemberType {
+    /**
+     * Not a js member.
+     */
+    NONE,
+    /**
+     * A JsConstructor.
+     */
+    CONSTRUCTOR {
+      @Override
+      public String computeName(JMember member) {
+        return "";
+      }
+    },
+    /**
+     * A JsMethod.
+     */
+    METHOD,
+    /**
+     * A JsProperty.
+     */
+    PROPERTY,
+    /**
+     * A getter JsProperty accessor. Usually in the form of getX()/isX().
+     */
+    GETTER("get") {
+      @Override
+      public String computeName(JMember member) {
+        String methodName = member.getName();
+        if (startsWithCamelCase(methodName, "get")) {
+          return Introspector.decapitalize(methodName.substring(3));
+        }
+        if (startsWithCamelCase(methodName, "is")) {
+          return Introspector.decapitalize(methodName.substring(2));
+        }
+        return JsInteropUtil.INVALID_JSNAME;
+      }
+      @Override
+      public boolean isPropertyAccessor() {
+        return true;
+      }
+    },
+    /**
+     * A setter JsProperty accessor. Usually in the form of setX(x).
+     */
+    SETTER("set") {
+      @Override
+      public String computeName(JMember member) {
+        String methodName = member.getName();
+        if (startsWithCamelCase(methodName, "set")) {
+          return Introspector.decapitalize(methodName.substring(3));
+        }
+        return JsInteropUtil.INVALID_JSNAME;
+      }
+      @Override
+      public boolean isPropertyAccessor() {
+        return true;
+      }
+    },
+    /**
+     * A property accessor but doesn't match setter/getter patterns.
+     */
+    UNDEFINED_ACCESSOR;
 
-  void setJsMemberInfo(String namespace, String name, boolean exported);
+    private String accessorKey;
+
+    private JsMemberType() { }
+
+    private JsMemberType(String accessorKey) {
+      this.accessorKey = accessorKey;
+    }
+
+    public String getPropertyAccessorKey() {
+      return accessorKey;
+    }
+
+    public boolean isPropertyAccessor() {
+      return getPropertyAccessorKey() != null;
+    }
+
+    public String computeName(JMember member) {
+      return member.getName();
+    }
+
+    private static boolean startsWithCamelCase(String string, String prefix) {
+      return string.length() > prefix.length() && string.startsWith(prefix)
+          && Character.isUpperCase(string.charAt(prefix.length()));
+    }
+  }
+
+  void setJsMemberInfo(JsMemberType type, String namespace, String name, boolean exported);
+
+  JsMemberType getJsMemberType();
 
   boolean isJsNative();
 
   boolean isJsOverlay();
+
+  boolean canBeReferencedExternally();
+
+  boolean isJsInteropEntryPoint();
 }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
index cb88496..535ff13 100755
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JDeclaredType.java
@@ -360,6 +360,10 @@
     return methods;
   }
 
+  public Iterable<JMember> getMembers() {
+    return Iterables.<JMember>concat(fields, methods);
+  }
+
   @Override
   public boolean isJsType() {
     return isJsType;
@@ -394,22 +398,16 @@
     return false;
   }
 
+  @Override
   public boolean canBeReferencedExternally() {
     if (isJsType()) {
       return true;
     }
-    for (JMethod method : getMethods()) {
-      if (method.canBeCalledExternally()) {
+    for (JMember member : getMembers()) {
+      if (member.canBeReferencedExternally()) {
         return true;
       }
     }
-
-    for (JField field : getFields()) {
-      if (field.canBeReferencedExternally()) {
-        return true;
-      }
-    }
-
     return false;
   }
 
@@ -613,14 +611,17 @@
     return null;
   }
 
+  @Override
   public String getJsName() {
     return Strings.isNullOrEmpty(jsName) ? getSimpleName() : jsName;
   }
 
+  @Override
   public String getJsNamespace() {
     return jsNamespace;
   }
 
+  @Override
   public String getQualifiedJsName() {
     return jsNamespace.isEmpty() ? getJsName() : jsNamespace + "." + getJsName();
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
index 26d48c4..27edfb0 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JField.java
@@ -80,6 +80,7 @@
   public static final JField NULL_FIELD = new JField(SourceOrigin.UNKNOWN, "nullField", null,
       JReferenceType.NULL_TYPE, false, Disposition.FINAL);
 
+  private JsMemberType jsMembertype = JsMemberType.NONE;
   private String jsName;
   private String jsNamespace;
   private boolean exported;
@@ -131,16 +132,25 @@
   }
 
   @Override
-  public void setJsMemberInfo(String namespace, String name, boolean exported) {
-    this.jsName = name;
+  public void setJsMemberInfo(
+      JsMemberType jsMembertype, String namespace, String name, boolean exported) {
+    this.jsMembertype = jsMembertype;
+    this.jsName = name != null ? name : jsMembertype.computeName(this);
     this.jsNamespace = namespace;
     this.exported = exported;
   }
 
-  public boolean isJsInteropEntryPoint() {
-    return exported && isStatic();
+  @Override
+  public JsMemberType getJsMemberType() {
+    return jsMembertype;
   }
 
+  @Override
+  public boolean isJsInteropEntryPoint() {
+    return exported && isStatic() && !isJsNative();
+  }
+
+  @Override
   public boolean canBeReferencedExternally() {
     return exported;
   }
@@ -161,10 +171,6 @@
     return false;
   }
 
-  public boolean isJsProperty() {
-    return jsName != null;
-  }
-
   @Override
   public boolean isJsNative() {
     return enclosingType.isJsNative() && jsName != null;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMember.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMember.java
index d73a303..c0ab0e3 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMember.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMember.java
@@ -21,7 +21,7 @@
  * Abstracts class members (i.e. fields and methods).
  */
 public interface JMember extends HasEnclosingType, HasName, HasJsInfo, HasType, HasSourceInfo,
-    CanBeSetFinal, CanBeStatic, CanBeAbstract {
+    CanBeSetFinal, CanBeStatic, CanBeAbstract, CanHaveSuppressedWarnings {
 
   boolean isPublic();
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
index 278b0fc..98a574f 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/ast/JMethod.java
@@ -26,7 +26,6 @@
 import com.google.gwt.dev.util.collect.Lists;
 import com.google.gwt.thirdparty.guava.common.collect.Sets;
 
-import java.beans.Introspector;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
@@ -40,76 +39,7 @@
 /**
  * A Java method implementation.
  */
-public class JMethod extends JNode implements JMember, CanBeAbstract, CanHaveSuppressedWarnings {
-
-  /**
-   * Indicates whether a method is a JsProperty accessor.
-   */
-  public enum JsPropertyAccessorType {
-    /**
-     * Not a property accessor.
-     */
-    NONE,
-    /**
-     * A getter property accessor. Usually in the form of getX()/isX().
-     */
-    GETTER("get") {
-      @Override
-      public String computeName(JMethod member) {
-        String methodName = member.getName();
-        if (startsWithCamelCase(methodName, "get")) {
-          return Introspector.decapitalize(methodName.substring(3));
-        }
-        if (startsWithCamelCase(methodName, "is")) {
-          return Introspector.decapitalize(methodName.substring(2));
-        }
-        return JsInteropUtil.INVALID_JSNAME;
-      }
-    },
-    /**
-     * A setter JsProperty accessor. Usually in the form of setX(x).
-     */
-    SETTER("set") {
-      @Override
-      public String computeName(JMethod member) {
-        String methodName = member.getName();
-        if (startsWithCamelCase(methodName, "set")) {
-          return Introspector.decapitalize(methodName.substring(3));
-        }
-        return JsInteropUtil.INVALID_JSNAME;
-      }
-    },
-    /**
-     * A property accessor but doesn't match setter/getter patterns.
-     */
-    UNDEFINED;
-
-    private String key;
-
-    JsPropertyAccessorType() {
-    }
-
-    JsPropertyAccessorType(String key) {
-      this.key = key;
-    }
-
-    public String getKey() {
-      return key;
-    }
-
-    public boolean isPropertyAccessor() {
-      return key != null;
-    }
-
-    public String computeName(JMethod method) {
-      return method.getName();
-    }
-
-    private static boolean startsWithCamelCase(String string, String prefix) {
-      return string.length() > prefix.length() && string.startsWith(prefix)
-          && Character.isUpperCase(string.charAt(prefix.length()));
-    }
-  }
+public class JMethod extends JNode implements JMember, CanBeAbstract {
 
   public static final Comparator<JMethod> BY_SIGNATURE_COMPARATOR = new Comparator<JMethod>() {
     @Override
@@ -121,7 +51,7 @@
   private String jsName;
   private boolean exported;
   private String jsNamespace;
-  private JsPropertyAccessorType jsPropertyType = JsPropertyAccessorType.NONE;
+  private JsMemberType jsMemberType = JsMemberType.NONE;
   private Specialization specialization;
   private InliningMode inliningMode = InliningMode.NORMAL;
   private boolean preventDevirtualization = false;
@@ -132,17 +62,20 @@
   private boolean isJsOverlay = false;
 
   @Override
-  public void setJsMemberInfo(String namespace, String name, boolean exported) {
-    this.jsName = name;
+  public void setJsMemberInfo(JsMemberType type, String namespace, String name, boolean exported) {
+    this.jsMemberType = type;
+    this.jsName = name != null ? name : type.computeName(this);
     this.jsNamespace = namespace;
     this.exported = exported;
   }
 
+  @Override
   public boolean isJsInteropEntryPoint() {
     return exported && !needsDynamicDispatch() && !isJsNative();
   }
 
-  public boolean canBeCalledExternally() {
+  @Override
+  public boolean canBeReferencedExternally() {
     if (exported || isJsFunctionMethod()) {
       return true;
     }
@@ -209,58 +142,38 @@
   }
 
   /**
-   * Returns {@code true} if this method is the first JsMethod in the method hierarchy that exposes
-   * an existing non-JsMethod inside a class.
+   * Returns {@code true} if this method is the first JsMember in the method hierarchy that exposes
+   * an existing non-JsMember inside a class.
    */
-  public boolean exposesNonJsMethod() {
-    if (isInterfaceMethod() || !isOrOverridesJsMethod()) {
+  public boolean exposesNonJsMember() {
+    if (isInterfaceMethod() || getJsMemberType() == JsMemberType.NONE) {
       return false;
     }
 
-    boolean hasNonJsMethodParent = false;
+    boolean hasNonJsMemberParent = false;
     for (JMethod overriddenMethod : overriddenMethods) {
-      if (!overriddenMethod.isOrOverridesJsMethod()) {
-        hasNonJsMethodParent = true;
+      if (overriddenMethod.getJsMemberType() == JsMemberType.NONE) {
+        hasNonJsMemberParent = true;
       }
-      if (overriddenMethod.exposesNonJsMethod()) {
+      if (overriddenMethod.exposesNonJsMember()) {
         return false; // some other method already exposed this method.
       }
     }
 
-    return hasNonJsMethodParent;
+    return hasNonJsMemberParent;
   }
 
-  public boolean isOrOverridesJsMethod() {
-    if (jsName != null) {
-      return true;
+  @Override
+  public JsMemberType getJsMemberType() {
+    if (jsMemberType != JsMemberType.NONE) {
+      return jsMemberType;
     }
     for (JMethod overriddenMethod : getOverriddenMethods()) {
-      if (overriddenMethod.jsName != null) {
-        return true;
+      if (overriddenMethod.jsMemberType != JsMemberType.NONE) {
+        return overriddenMethod.jsMemberType;
       }
     }
-    return false;
-  }
-
-  public void setJsPropertyInfo(String jsName, JsPropertyAccessorType jsPropertyType) {
-    this.jsName = jsName != null ? jsName : jsPropertyType.computeName(this);
-    this.jsPropertyType = jsPropertyType;
-  }
-
-  public JsPropertyAccessorType getJsPropertyAccessorType() {
-    if (isJsPropertyAccessor()) {
-      return jsPropertyType;
-    }
-    for (JMethod overriddenMethod : getOverriddenMethods()) {
-      if (overriddenMethod.isJsPropertyAccessor()) {
-        return overriddenMethod.jsPropertyType;
-      }
-    }
-    return JsPropertyAccessorType.NONE;
-  }
-
-  private boolean isJsPropertyAccessor() {
-    return jsPropertyType != JsPropertyAccessorType.NONE;
+    return JsMemberType.NONE;
   }
 
   private boolean isJsFunctionMethod() {
@@ -284,6 +197,7 @@
     return (isAbstract || body == null) && jsName != null;
   }
 
+  @Override
   public boolean isJsOverlay() {
     return isJsOverlay || (getEnclosingType() != null && getEnclosingType().isJsoType());
   }
@@ -690,6 +604,7 @@
     }
   }
 
+  @Override
   public boolean isPrivate() {
     return access == AccessModifier.PRIVATE.ordinal();
   }
@@ -704,6 +619,7 @@
     return isStatic;
   }
 
+  @Override
   public boolean isSynthetic() {
     return isSynthetic;
   }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
index 8b2710a..9d9faa4 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowAnalyzer.java
@@ -616,7 +616,7 @@
           // Returning from this method passes a value from JavaScript into Java.
           maybeRescueJavaScriptObjectPassingIntoJava(method.getType());
         }
-        if (method.canBeCalledExternally() || method.canBeImplementedExternally()) {
+        if (method.canBeReferencedExternally() || method.canBeImplementedExternally()) {
           for (JParameter param : method.getParams()) {
             // Parameters in JsExport, JsType, JsFunction methods should not be pruned in order to
             // keep the API intact.
@@ -683,7 +683,7 @@
       JDeclaredType declaredType = (JDeclaredType) type;
 
       for (JMethod method : declaredType.getMethods()) {
-        if (method.canBeCalledExternally()) {
+        if (method.canBeReferencedExternally()) {
           rescue(method);
         }
       }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowRecorder.java b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowRecorder.java
index ee30b35..d13ed82 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowRecorder.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/ControlFlowRecorder.java
@@ -137,7 +137,7 @@
           overriddenMethodName);
     }
 
-    if (x.canBeCalledExternally()) {
+    if (x.canBeReferencedExternally()) {
       stringAnalyzableTypeEnvironment.recordExportedMethodInType(currentMethodName, typeName);
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 07552c3..9cbda78 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -30,6 +30,7 @@
 import com.google.gwt.dev.jjs.SourceOrigin;
 import com.google.gwt.dev.jjs.ast.Context;
 import com.google.gwt.dev.jjs.ast.HasEnclosingType;
+import com.google.gwt.dev.jjs.ast.HasJsInfo.JsMemberType;
 import com.google.gwt.dev.jjs.ast.HasName;
 import com.google.gwt.dev.jjs.ast.JAbstractMethodBody;
 import com.google.gwt.dev.jjs.ast.JArrayLength;
@@ -64,7 +65,6 @@
 import com.google.gwt.dev.jjs.ast.JLocalRef;
 import com.google.gwt.dev.jjs.ast.JMember;
 import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethod.JsPropertyAccessorType;
 import com.google.gwt.dev.jjs.ast.JMethodBody;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
 import com.google.gwt.dev.jjs.ast.JNameOf;
@@ -241,7 +241,7 @@
         jsName = topScope.declareName(mangleName(x), x.getName());
       } else {
         jsName =
-            x.isJsProperty()
+            x.getJsMemberType() != JsMemberType.NONE
                 ? scopeStack.peek().declareUnobfuscatableName(x.getJsName())
                 : scopeStack.peek().declareName(mangleName(x), x.getName());
       }
@@ -366,9 +366,8 @@
           } else if (x.isPackagePrivate()) {
             polyName = interfaceScope.declareName(mangleNameForPackagePrivatePoly(x), name);
           } else {
-            boolean isJsMethod = x.isOrOverridesJsMethod();
             polyName =
-                isJsMethod
+                x.getJsMemberType() != JsMemberType.NONE
                     ? interfaceScope.declareUnobfuscatableName(x.getJsName())
                     : interfaceScope.declareName(mangleNameForPoly(x), name);
           }
@@ -886,7 +885,7 @@
         List<JsExpression> args, SourceInfo sourceInfo) {
       JsNameRef methodName = createStaticReference(method, sourceInfo);
       JsExpression result = JsUtils.createInvocationOrPropertyAccess(
-          sourceInfo, method.getJsPropertyAccessorType(), methodName, args);
+          sourceInfo, method.getJsMemberType(), methodName, args);
       return JsUtils.createCommaExpression(unnecessaryQualifier, result);
     }
 
@@ -945,10 +944,8 @@
     private JsExpression dispatchToInstanceMethod(
         JsExpression instance, JMethod method, List<JsExpression> args, SourceInfo sourceInfo) {
       JsNameRef reference = polymorphicNames.get(method).makeQualifiedRef(sourceInfo, instance);
-
-      JsPropertyAccessorType propertyAccessorType = method.getJsPropertyAccessorType();
-      return JsUtils
-          .createInvocationOrPropertyAccess(sourceInfo, propertyAccessorType, reference, args);
+      return JsUtils.createInvocationOrPropertyAccess(
+          sourceInfo, method.getJsMemberType(), reference, args);
     }
 
     @Override
@@ -1456,24 +1453,18 @@
           exportedMembersByExportName.put(type.getQualifiedJsName(), type);
         }
 
-        for (JMethod method : type.getMethods()) {
-          if (method.isJsInteropEntryPoint()) {
-            exportedMembersByExportName.put(method.getQualifiedJsName(), method);
-          }
-        }
-
-        for (JField field : type.getFields()) {
-          if (field.isJsInteropEntryPoint()) {
-            if (!field.isFinal()) {
-              // TODO(rluble): move waring to JsInteropRestrictionChecker.
+        for (JMember member : type.getMembers()) {
+          if (member.isJsInteropEntryPoint()) {
+            if (member.getJsMemberType() == JsMemberType.PROPERTY && !member.isFinal()) {
+              // TODO(goktug): Remove the warning when we export via Object.defineProperty
               logger.log(
                   TreeLogger.Type.WARN,
                   "Exporting effectively non-final field "
-                      + field.getQualifiedName()
+                      + member.getQualifiedName()
                       + ". Due to the way exporting works, the value of the"
                       + " exported field will not be reflected across Java/JavaScript border.");
             }
-            exportedMembersByExportName.put(field.getQualifiedJsName(), field);
+            exportedMembersByExportName.put(member.getQualifiedJsName(), member);
           }
         }
       }
@@ -2221,7 +2212,7 @@
     }
 
     private void generatePrototypeAssignment(JMethod method, JsName name, JsExpression rhs) {
-      generatePrototypeAssignment(method, name, rhs, method.getJsPropertyAccessorType());
+      generatePrototypeAssignment(method, name, rhs, method.getJsMemberType());
     }
 
      /**
@@ -2229,11 +2220,11 @@
       * created for {@code method}.
       */
     private void generatePrototypeAssignment(JMethod method, JsName name, JsExpression rhs,
-        JsPropertyAccessorType accessorType) {
+        JsMemberType memberType) {
       SourceInfo sourceInfo = method.getSourceInfo();
       JsNameRef prototypeQualifierOf = getPrototypeQualifierOf(method);
       JsNameRef lhs = name.makeQualifiedRef(sourceInfo, prototypeQualifierOf);
-      switch (accessorType) {
+      switch (memberType) {
         case GETTER:
         case SETTER:
           emitPropertyImplementation(method, prototypeQualifierOf, name.makeRef(sourceInfo), rhs);
@@ -2260,7 +2251,7 @@
                // {name: {get: function() { ..... }} or {set : function (v) {....}}}
               .add(name, JsObjectLiteral.builder(sourceInfo)
                       // {get: function() { ..... }} or {set : function (v) {....}}
-                  .add(method.getJsPropertyAccessorType().getKey(), methodDefinitionStatement)
+                  .add(method.getJsMemberType().getPropertyAccessorKey(), methodDefinitionStatement)
                   .build())
               .build();
 
@@ -2282,7 +2273,7 @@
       JsName polyName = polymorphicNames.get(method);
       JsExpression bridge = JsUtils.createBridge(method, polyName, topScope);
       // Aliases are never property accessors.
-      generatePrototypeAssignment(method, alias, bridge, JsPropertyAccessorType.NONE);
+      generatePrototypeAssignment(method, alias, bridge, JsMemberType.NONE);
     }
 
     private JsExprStmt outputDisplayName(JsNameRef function, JMethod method) {
@@ -2332,7 +2323,7 @@
         generatePrototypeAssignment(method, polymorphicNames.get(method), functionDefinition);
       }
 
-      if (method.exposesNonJsMethod()) {
+      if (method.exposesNonJsMember()) {
         JsName internalMangledName = interfaceScope.declareName(mangleNameForPoly(method),
             method.getName());
         generatePrototypeDefinitionAlias(method, internalMangledName);
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
index 024cf91..73fbfea 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JjsUtils.java
@@ -386,7 +386,7 @@
         });
     // A synthetic accidental  override is unnecessary iff it retains the same property
     // name (polyname) as the the concrete method it overrides.
-    return overridesConcreteMethod && !method.exposesNonJsMethod();
+    return overridesConcreteMethod && !method.exposesNonJsMember();
   }
 
   /**
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
index c0f8ab6..f1dbe2b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JsInteropRestrictionChecker.java
@@ -21,7 +21,9 @@
 import com.google.gwt.dev.jjs.HasSourceInfo;
 import com.google.gwt.dev.jjs.ast.CanHaveSuppressedWarnings;
 import com.google.gwt.dev.jjs.ast.Context;
+import com.google.gwt.dev.jjs.ast.HasJsInfo.JsMemberType;
 import com.google.gwt.dev.jjs.ast.HasJsName;
+import com.google.gwt.dev.jjs.ast.HasType;
 import com.google.gwt.dev.jjs.ast.JClassType;
 import com.google.gwt.dev.jjs.ast.JConstructor;
 import com.google.gwt.dev.jjs.ast.JDeclarationStatement;
@@ -34,7 +36,6 @@
 import com.google.gwt.dev.jjs.ast.JInterfaceType;
 import com.google.gwt.dev.jjs.ast.JMember;
 import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethod.JsPropertyAccessorType;
 import com.google.gwt.dev.jjs.ast.JMethodBody;
 import com.google.gwt.dev.jjs.ast.JMethodCall;
 import com.google.gwt.dev.jjs.ast.JParameter;
@@ -226,50 +227,32 @@
     return call.getTarget().equals(targetCtor);
   }
 
-  private void checkField(Map<String, JsMember> localNames, JField field) {
-    if (field.getEnclosingType().isJsNative()) {
-      checkMemberOfNativeJsType(field);
+  private void checkMember(Map<String, JsMember> localNames, JMember member) {
+    if (member.getEnclosingType().isJsNative()) {
+      checkMemberOfNativeJsType(member);
     }
 
-    checkUnusableByJs(field);
-
-    if (!field.isJsProperty()) {
+    if (member.isJsOverlay()) {
+      checkJsOverlay((JMethod) member);
       return;
     }
 
-    checkMemberQualifiedJsName(field);
-
-    if (field.needsDynamicDispatch()) {
-      checkLocalName(localNames, field);
-    } else if (!field.isJsNative()) {
-      checkGlobalName(field);
-    }
-  }
-
-  private void checkMethod(Map<String, JsMember> localNames, JMethod method) {
-    if (method.getEnclosingType().isJsNative()) {
-      checkMemberOfNativeJsType(method);
+    if (member.canBeReferencedExternally()) {
+      checkUnusableByJs(member);
     }
 
-    if (method.isJsOverlay()) {
-      checkJsOverlay(method);
+    if (member.getJsMemberType() == JsMemberType.NONE) {
       return;
     }
 
-    checkUnusableByJs(method);
+    checkMemberQualifiedJsName(member);
 
-    if (!method.isOrOverridesJsMethod()) {
-      return;
+    if (isCheckedLocalName(member)) {
+      checkLocalName(localNames, member);
     }
 
-    checkMemberQualifiedJsName(method);
-
-    if (method.needsDynamicDispatch()) {
-      if (!isSyntheticBridgeMethod(method)) {
-        checkLocalName(localNames, method);
-      }
-    } else if (!method.isJsNative()) {
-      checkGlobalName(method);
+    if (isCheckedGlobalName(member)) {
+      checkGlobalName(member);
     }
   }
 
@@ -286,8 +269,7 @@
 
   private void checkLocalName(Map<String, JsMember> localNames, JMember member) {
     if (member.getJsName().equals(JsInteropUtil.INVALID_JSNAME)) {
-      if (member instanceof JMethod
-          && ((JMethod) member).getJsPropertyAccessorType().isPropertyAccessor()) {
+      if (member.getJsMemberType().isPropertyAccessor()) {
         logError(
             member,
             "JsProperty %s should either follow Java Bean naming conventions or "
@@ -319,27 +301,23 @@
         getMemberDescription(member), getMemberDescription(oldMember.member), member.getJsName());
   }
 
-  private void checkJsPropertyAccessor(JMember x, JsMember newMember) {
-    if (!(x instanceof JMethod)) {
-      return;
-    }
-    JMethod method = (JMethod) x;
-
-    if (method.getJsPropertyAccessorType() == JsPropertyAccessorType.UNDEFINED) {
-      logError(method, "JsProperty %s should have a correct setter or getter signature.",
-          getMemberDescription(method));
+  private void checkJsPropertyAccessor(JMember member, JsMember newMember) {
+    if (member.getJsMemberType() == JsMemberType.UNDEFINED_ACCESSOR) {
+      logError(member, "JsProperty %s should have a correct setter or getter signature.",
+          getMemberDescription(member));
     }
 
-    if (method.getJsPropertyAccessorType() == JsPropertyAccessorType.GETTER) {
-      if (method.getType() != JPrimitiveType.BOOLEAN && method.getName().startsWith("is")) {
-        logError(method, "JsProperty %s cannot have a non-boolean return.",
-            getMemberDescription(method));
+    if (member.getJsMemberType() == JsMemberType.GETTER) {
+      if (member.getType() != JPrimitiveType.BOOLEAN && member.getName().startsWith("is")) {
+        logError(member, "JsProperty %s cannot have a non-boolean return.",
+            getMemberDescription(member));
       }
     }
 
     if (newMember.setter != null && newMember.getter != null) {
-      if (newMember.getter.getType() != newMember.setter.getParams().get(0).getType()) {
-        logError(method, "JsProperty setter %s and getter %s cannot have inconsistent types.",
+      List<JParameter> setterParams = ((JMethod) newMember.setter).getParams();
+      if (newMember.getter.getType() != setterParams.get(0).getType()) {
+        logError(member, "JsProperty setter %s and getter %s cannot have inconsistent types.",
             getMemberDescription(newMember.setter), getMemberDescription(newMember.getter));
       }
     }
@@ -447,7 +425,7 @@
       @Override
       public void endVisit(JMethodCall x, Context ctx) {
         JMethod target = x.getTarget();
-        if (x.isStaticDispatchOnly() && target.getJsPropertyAccessorType().isPropertyAccessor()) {
+        if (x.isStaticDispatchOnly() && target.getJsMemberType().isPropertyAccessor()) {
           logError(x, "Cannot call property accessor %s via super.",
               getMemberDescription(target));
         }
@@ -603,62 +581,45 @@
     }
 
     Map<String, JsMember> localNames = collectNames(type.getSuperClass());
-
-    for (JField field : type.getFields()) {
-      checkField(localNames, field);
-    }
-    for (JMethod method : type.getMethods()) {
-      checkMethod(localNames, method);
+    for (JMember member : type.getMembers()) {
+      checkMember(localNames, member);
     }
   }
 
-  private void checkUnusableByJs(JMethod method) {
-    if (!method.canBeCalledExternally() || isUnusableByJsSuppressed(method.getEnclosingType())
-        || isUnusableByJsSuppressed(method)) {
-      return;
-    }
-    // check parameters.
-    for (JParameter parameter : method.getParams()) {
-      if (!parameter.getType().canBeReferencedExternally()
-          && !isUnusableByJsSuppressed(parameter)) {
-        logWarning(
-            parameter,
-            "[unusable-by-js] Type of parameter '%s' in method %s is not usable by but exposed to"
-                + " JavaScript.",
-            parameter.getName(), getMemberDescription(method));
+  private void checkUnusableByJs(JMember member) {
+    logIfUnusableByJs(member, member instanceof JField ? "Type of" : "Return type of", member);
+
+    if (member instanceof JMethod) {
+      for (JParameter parameter : ((JMethod) member).getParams()) {
+        String prefix = String.format("Type of parameter '%s' in", parameter.getName());
+        logIfUnusableByJs(parameter, prefix, member);
       }
     }
-    // check return type.
-    if (!method.getType().canBeReferencedExternally()) {
-      logWarning(
-          method, "[unusable-by-js] Return type of %s is not usable by but exposed to JavaScript.",
-          getMemberDescription(method));
-    }
   }
 
-  private void checkUnusableByJs(JField field) {
-    if (!field.canBeReferencedExternally() || isUnusableByJsSuppressed(field.getEnclosingType())
-        || isUnusableByJsSuppressed(field)) {
+  private <T extends HasType & CanHaveSuppressedWarnings> void logIfUnusableByJs(
+      T hasType, String prefix, JMember x) {
+    if (hasType.getType().canBeReferencedExternally()) {
       return;
     }
-    if (!field.getType().canBeReferencedExternally()) {
-      logWarning(
-          field, "[unusable-by-js] Type of field '%s' in type '%s' is not usable by but exposed to "
-              + "JavaScript.",
-          field.getName(), JjsUtils.getReadableDescription(field.getEnclosingType()));
+    if (isUnusableByJsSuppressed(x.getEnclosingType()) || isUnusableByJsSuppressed(x)
+        || isUnusableByJsSuppressed(hasType)) {
+      return;
     }
+    logWarning(x, "[unusable-by-js] %s %s is not usable by but exposed to JavaScript.", prefix,
+        getMemberDescription(x));
   }
 
   private static class JsMember {
     private JMember member;
-    private JMethod setter;
-    private JMethod getter;
+    private JMember setter;
+    private JMember getter;
 
     public JsMember(JMember member) {
       this.member = member;
     }
 
-    public JsMember(JMethod member, JMethod setter, JMethod getter) {
+    public JsMember(JMember member, JMember setter, JMember getter) {
       this.member = member;
       this.setter = setter;
       this.getter = getter;
@@ -679,24 +640,23 @@
     }
 
     LinkedHashMap<String, JsMember> memberByLocalMemberNames = collectNames(type.getSuperClass());
-
-    for (JField field : type.getFields()) {
-      if (!field.isJsProperty() || !field.needsDynamicDispatch()) {
-        continue;
+    for (JMember member : type.getMembers()) {
+      if (isCheckedLocalName(member)) {
+        updateJsMembers(memberByLocalMemberNames, member);
       }
-      updateJsMembers(memberByLocalMemberNames, field);
-    }
-    for (JMethod method : type.getMethods()) {
-      if (!method.isOrOverridesJsMethod() || !method.needsDynamicDispatch()
-          || isSyntheticBridgeMethod(method)) {
-        continue;
-      }
-      updateJsMembers(memberByLocalMemberNames, method);
     }
     return memberByLocalMemberNames;
   }
 
-  private boolean isSyntheticBridgeMethod(JMethod method) {
+  private boolean isCheckedLocalName(JMember method) {
+    return method.needsDynamicDispatch() && method.getJsMemberType() != JsMemberType.NONE
+        && !isSyntheticBridgeMethod(method);
+  }
+
+  private boolean isSyntheticBridgeMethod(JMember member) {
+    if (!(member instanceof JMethod)) {
+      return false;
+    }
     // A name slot taken up by a synthetic method, such as a bridge method for a generic method,
     // is not the fault of the user and so should not be reported as an error. JS generation
     // should take responsibility for ensuring that only the correct method version (in this
@@ -704,7 +664,11 @@
     // (such as an accidental override forwarding method that occurs when a JsType interface
     // starts exposing a method in class B that is only ever implemented in its parent class A)
     // though should be checked since they are exported and do take up an name slot.
-    return method.isSynthetic() && !method.isForwarding();
+    return member.isSynthetic() && !((JMethod) member).isForwarding();
+  }
+
+  private boolean isCheckedGlobalName(JMember member) {
+    return !member.needsDynamicDispatch() && !member.isJsNative();
   }
 
   private void updateJsMembers(Map<String, JsMember> memberByLocalMemberNames, JMember member) {
@@ -714,45 +678,41 @@
   }
 
   private JsMember createOrUpdateJsMember(JsMember jsMember, JMember member) {
-    if (member instanceof JField) {
-      return new JsMember(member);
-    }
-
-    JMethod method = (JMethod) member;
-    switch (method.getJsPropertyAccessorType()) {
+    switch (member.getJsMemberType()) {
       case GETTER:
         if (jsMember != null && jsMember.isPropertyAccessor()) {
-          if (jsMember.getter == null || overrides(method, jsMember.getter)) {
-            jsMember.getter = method;
-            jsMember.member = method;
+          if (jsMember.getter == null || overrides(member, jsMember.getter)) {
+            jsMember.getter = member;
+            jsMember.member = member;
             return jsMember;
           }
         }
-        return new JsMember(method, jsMember == null ? null : jsMember.setter, method);
+        return new JsMember(member, jsMember == null ? null : jsMember.setter, member);
       case SETTER:
         if (jsMember != null && jsMember.isPropertyAccessor()) {
-          if (jsMember.setter == null || overrides(method, jsMember.setter)) {
-            jsMember.setter = method;
-            jsMember.member = method;
+          if (jsMember.setter == null || overrides(member, jsMember.setter)) {
+            jsMember.setter = member;
+            jsMember.member = member;
             return jsMember;
           }
         }
-        return new JsMember(method, method, jsMember == null ? null : jsMember.getter);
+        return new JsMember(member, member, jsMember == null ? null : jsMember.getter);
       default:
         if (jsMember != null) {
-          if (overrides(method, jsMember.member)) {
-            jsMember.member = method;
+          if (overrides(member, jsMember.member)) {
+            jsMember.member = member;
             return jsMember;
           }
         }
-        return new JsMember(method);
+        return new JsMember(member);
     }
   }
 
-  private boolean overrides(JMethod method, JMember potentiallyOverriddenMember) {
-    if (potentiallyOverriddenMember instanceof JField) {
+  private boolean overrides(JMember member, JMember potentiallyOverriddenMember) {
+    if (member instanceof JField || potentiallyOverriddenMember instanceof JField) {
       return false;
     }
+    JMethod method = (JMethod) member;
     if (method.getOverriddenMethods().contains(potentiallyOverriddenMember)) {
       return true;
     }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
index 275dbce..7c8dba6 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
@@ -127,7 +127,7 @@
     }
 
     private boolean isNotOptimizable(JMethod x) {
-      return x.needsDynamicDispatch() || x.canBeCalledExternally();
+      return x.needsDynamicDispatch() || x.canBeReferencedExternally();
     }
 
     private boolean equalLiterals(JValueLiteral l1, JValueLiteral l2) {
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
index 76751e1..f42ba3b 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TypeTightener.java
@@ -564,7 +564,7 @@
     public void endVisit(JParameter x, Context ctx) {
       JMethod currentMethod = getCurrentMethod();
       if (program.codeGenTypes.contains(currentMethod.getEnclosingType())
-          || currentMethod.canBeCalledExternally()) {
+          || currentMethod.canBeReferencedExternally()) {
         // We cannot tighten this parameter as we don't know all callers.
         return;
       }
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
index 3433c78..19f5151 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/UnifyAst.java
@@ -1329,7 +1329,7 @@
 
     // Flow into any reachable virtual methods.
     for (JMethod method : type.getMethods()) {
-      if (method.canBeCalledExternally()) {
+      if (method.canBeReferencedExternally()) {
         flowInto(method);
         continue;
       }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsUtils.java b/dev/core/src/com/google/gwt/dev/js/JsUtils.java
index 729c74e..bc296c7 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsUtils.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsUtils.java
@@ -16,8 +16,8 @@
 package com.google.gwt.dev.js;
 
 import com.google.gwt.dev.jjs.SourceInfo;
+import com.google.gwt.dev.jjs.ast.HasJsInfo.JsMemberType;
 import com.google.gwt.dev.jjs.ast.JMethod;
-import com.google.gwt.dev.jjs.ast.JMethod.JsPropertyAccessorType;
 import com.google.gwt.dev.jjs.ast.JParameter;
 import com.google.gwt.dev.jjs.ast.JPrimitiveType;
 import com.google.gwt.dev.jjs.ast.JProgram;
@@ -108,7 +108,7 @@
     }
 
     JsExpression invocation =
-        createInvocationOrPropertyAccess(sourceInfo, method.getJsPropertyAccessorType(), ref, args);
+        createInvocationOrPropertyAccess(sourceInfo, method.getJsMemberType(), ref, args);
 
     JsBlock block = new JsBlock(sourceInfo);
     if (method.getType() == JPrimitiveType.VOID) {
@@ -162,8 +162,8 @@
   }
 
   public static JsExpression createInvocationOrPropertyAccess(SourceInfo sourceInfo,
-      JsPropertyAccessorType propertyAccessorType, JsNameRef reference, List<JsExpression> args) {
-    switch (propertyAccessorType) {
+      JsMemberType memberType, JsNameRef reference, List<JsExpression> args) {
+    switch (memberType) {
       case SETTER:
         assert args.size() == 1;
         return createAssignment(reference, args.get(0));
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
index 9aaf79f..656fbd7 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/JsInteropRestrictionCheckerTest.java
@@ -1850,7 +1850,7 @@
         "}",
         "@JsFunction public static interface FI  { void f(A a); }", // JsFunction method is checked.
         "@JsType public static class Buggy {",
-        "  public A field;", // exported field
+        "  public A f;", // exported field
         "  public A f1(A a) { return null; }", // regular class fails.
         "  public A[] f2(A[] a) { return null; }", // array of regular class fails.
         "  public long f3(long a) { return 1l; }", // long fails.
@@ -1861,39 +1861,38 @@
         "}");
 
     assertBuggySucceeds(
+        "Line 12: [unusable-by-js] Type of parameter 'a' in "
+            + "'void EntryPoint.C.fc1(EntryPoint.A)' is not usable by but exposed to JavaScript.",
+        "Line 16: [unusable-by-js] Type of 'EntryPoint.A EntryPoint.D.a' is not usable by but "
+            + "exposed to JavaScript.",
+        "Line 18: [unusable-by-js] Type of parameter 'a' in "
+            + "'void EntryPoint.FI.f(EntryPoint.A)' is not usable by but exposed to JavaScript.",
+        "Line 20: [unusable-by-js] Type of 'EntryPoint.A EntryPoint.Buggy.f' is not usable by but "
+            + "exposed to JavaScript.",
         "Line 21: [unusable-by-js] Return type of 'EntryPoint.A EntryPoint.Buggy.f1(EntryPoint.A)' "
             + "is not usable by but exposed to JavaScript.",
+        "Line 21: [unusable-by-js] Type of parameter 'a' in "
+            + "'EntryPoint.A EntryPoint.Buggy.f1(EntryPoint.A)' is not usable by but "
+            + "exposed to JavaScript.",
         "Line 22: [unusable-by-js] Return type of "
             + "'EntryPoint.A[] EntryPoint.Buggy.f2(EntryPoint.A[])' is not usable by but "
             + "exposed to JavaScript.",
+        "Line 22: [unusable-by-js] Type of parameter 'a' in "
+            + "'EntryPoint.A[] EntryPoint.Buggy.f2(EntryPoint.A[])' is not usable by but "
+            + "exposed to JavaScript.",
         "Line 23: [unusable-by-js] Return type of 'long EntryPoint.Buggy.f3(long)' is not "
             + "usable by but exposed to JavaScript.",
+        "Line 23: [unusable-by-js] Type of parameter 'a' in "
+            + "'long EntryPoint.Buggy.f3(long)' is not usable by but exposed to JavaScript.",
         "Line 24: [unusable-by-js] Return type of 'EntryPoint.B EntryPoint.Buggy.f4(EntryPoint.B)' "
             + "is not usable by but exposed to JavaScript.",
-        "Line 20: [unusable-by-js] Type of field 'field' in type 'EntryPoint.Buggy' "
-            + "is not usable by but exposed to JavaScript.",
-        "Line 21: [unusable-by-js] Type of parameter 'a' in method "
-            + "'EntryPoint.A EntryPoint.Buggy.f1(EntryPoint.A)' is not usable by but "
-            + "exposed to JavaScript.",
-        "Line 22: [unusable-by-js] Type of parameter 'a' in method "
-            + "'EntryPoint.A[] EntryPoint.Buggy.f2(EntryPoint.A[])' is not usable by but "
-            + "exposed to JavaScript.",
-        "Line 23: [unusable-by-js] Type of parameter 'a' in method "
-            + "'long EntryPoint.Buggy.f3(long)' is not usable by but exposed to JavaScript.",
-        "Line 24: [unusable-by-js] Type of parameter 'a' in method "
+        "Line 24: [unusable-by-js] Type of parameter 'a' in "
             + "'EntryPoint.B EntryPoint.Buggy.f4(EntryPoint.B)' is not usable by but "
             + "exposed to JavaScript.",
-        "Line 25: [unusable-by-js] Type of parameter 'a' in method "
+        "Line 25: [unusable-by-js] Type of parameter 'a' in "
             + "'void EntryPoint.Buggy.f5(Object[][])' is not usable by but exposed to JavaScript.",
-        "Line 26: [unusable-by-js] Type of parameter 'a' in method "
-            + "'void EntryPoint.Buggy.f6(Object[])' is not usable by but exposed to JavaScript.",
-        "Line 18: [unusable-by-js] Type of parameter 'a' in method "
-            + "'void EntryPoint.FI.f(EntryPoint.A)' is not usable by but exposed to JavaScript.",
-        "Line 12: [unusable-by-js] Type of parameter 'a' in method "
-            // JsMethod in non-jstype class.
-            + "'void EntryPoint.C.fc1(EntryPoint.A)' is not usable by but exposed to JavaScript.",
-        "Line 16: [unusable-by-js] Type of field 'a' in type " // JsProperty in non-jstype class.
-            + "'EntryPoint.D' is not usable by but exposed to JavaScript.");
+        "Line 26: [unusable-by-js] Type of parameter 'a' in "
+            + "'void EntryPoint.Buggy.f6(Object[])' is not usable by but exposed to JavaScript.");
   }
 
   public void testUnusableByJsAccidentalOverrideSuppressionWarns()
@@ -1911,7 +1910,7 @@
         "public static class Buggy extends Parent implements Foo {}");
 
     assertBuggySucceeds(
-        "Line 10: [unusable-by-js] Type of parameter 'x' in method "
+        "Line 10: [unusable-by-js] Type of parameter 'x' in "
             + "'void EntryPoint.Parent.doIt(Class)' (exposed by 'EntryPoint.Buggy') is not usable "
             + "by but exposed to JavaScript.");
   }
