          return false;
        }
      }
-@@ -161,7 +161,7 @@ class RecordType extends PrototypeObjectType {
-       // is returned.
-       for (String property : properties.keySet()) {
-         if (thatRecord.hasProperty(property) &&
--            !thatRecord.getPropertyType(property).isInvariant(
-+            !thatRecord.getPropertyType(property).isEquivalentTo(
-                 getPropertyType(property))) {
-           return registry.getNativeObjectType(JSTypeNative.NO_TYPE);
-         }
 @@ -201,7 +201,8 @@ class RecordType extends PrototypeObjectType {
            JSType altPropType = alt.getPropertyType(propName);
            if (altPropType != null && !alt.isEquivalentTo(this) &&

     boolean thatUnknown = that.isUnknownType();
-    if (thisUnknown || thatUnknown) {
-      if (eqMethod == EquivalenceMethod.INVARIANT) {
+   if (isUnknownType() || that.isUnknownType()) {
+      if (tolerateUnknowns) {
         // If we're checking for invariance, the unknown type is invariant
         // with everyone.

             builder.addAlternate(alt);
           }
         }
@@ -264,6 +265,7 @@ class RecordType extends PrototypeObjectType {
 
       JSType propA = typeA.getPropertyType(property);
       JSType propB = typeB.getPropertyType(property);
+      if (!propA.isUnknownType() && !propB.isUnknownType()) {
       if (typeA.isPropertyTypeDeclared(property)) {
         // If one declared property isn't invariant,
         // then the whole record isn't covariant.
@@ -275,6 +277,7 @@ class RecordType extends PrototypeObjectType {
         // then the whole record isn't covariant.
         if (!propA.isSubtype(propB)) {
