diff --git a/pkg/compiler/lib/src/io/location_provider.dart b/pkg/compiler/lib/src/io/location_provider.dart
index fff55c5..4f36c5e 100644
--- a/pkg/compiler/lib/src/io/location_provider.dart
+++ b/pkg/compiler/lib/src/io/location_provider.dart
@@ -40,7 +40,8 @@
   @override
   Location getLocation(int offset) {
     RangeError.checkValueInInterval(offset, 0, length, 'offset');
-    return new Source(lineStarts, null, null, null).getLocation(null, offset);
+    return new Source(lineStarts, const <int>[], null, null)
+        .getLocation(null, offset);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/field_builder.dart b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
index da7aea2..1e93f43 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -125,8 +125,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference})
+      Reference lateGetterReference,
+      Reference lateSetterReference})
       : super(libraryBuilder, charOffset) {
     Uri fileUri = libraryBuilder?.fileUri;
     // If in mixed mode, late lowerings cannot use `null` as a sentinel on
@@ -134,8 +134,12 @@
     late_lowering.IsSetStrategy isSetStrategy =
         late_lowering.computeIsSetStrategy(libraryBuilder);
     if (isAbstract || isExternal) {
-      _fieldEncoding = new AbstractOrExternalFieldEncoding(
-          fileUri, charOffset, charEndOffset, getterReference, setterReference,
+      assert(lateIsSetGetterReference == null);
+      assert(lateIsSetSetterReference == null);
+      assert(lateGetterReference == null);
+      assert(lateSetterReference == null);
+      _fieldEncoding = new AbstractOrExternalFieldEncoding(fileUri, charOffset,
+          charEndOffset, fieldGetterReference, fieldSetterReference,
           isAbstract: isAbstract,
           isExternal: isExternal,
           isFinal: isFinal,
@@ -157,8 +161,8 @@
               fieldSetterReference,
               lateIsSetGetterReference,
               lateIsSetSetterReference,
-              getterReference,
-              setterReference,
+              lateGetterReference,
+              lateSetterReference,
               isCovariant,
               isSetStrategy);
         } else {
@@ -171,8 +175,8 @@
               fieldSetterReference,
               lateIsSetGetterReference,
               lateIsSetSetterReference,
-              getterReference,
-              setterReference,
+              lateGetterReference,
+              lateSetterReference,
               isCovariant,
               isSetStrategy);
         }
@@ -187,8 +191,8 @@
               fieldSetterReference,
               lateIsSetGetterReference,
               lateIsSetSetterReference,
-              getterReference,
-              setterReference,
+              lateGetterReference,
+              lateSetterReference,
               isCovariant,
               isSetStrategy);
         } else {
@@ -201,8 +205,8 @@
               fieldSetterReference,
               lateIsSetGetterReference,
               lateIsSetSetterReference,
-              getterReference,
-              setterReference,
+              lateGetterReference,
+              lateSetterReference,
               isCovariant,
               isSetStrategy);
         }
@@ -222,8 +226,8 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
       } else {
@@ -236,16 +240,16 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
       }
     } else {
       assert(lateIsSetGetterReference == null);
       assert(lateIsSetSetterReference == null);
-      assert(getterReference == null);
-      assert(setterReference == null);
+      assert(lateGetterReference == null);
+      assert(lateSetterReference == null);
       _fieldEncoding = new RegularFieldEncoding(
           fileUri, charOffset, charEndOffset,
           isFinal: isFinal,
@@ -838,8 +842,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference,
+      Reference lateGetterReference,
+      Reference lateSetterReference,
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : fileOffset = charOffset,
@@ -879,11 +883,11 @@
           ..fileOffset = charOffset
           ..fileEndOffset = charEndOffset,
         fileUri: fileUri,
-        reference: getterReference)
+        reference: lateGetterReference)
       ..fileOffset = charOffset
       ..fileEndOffset = charEndOffset
       ..isNonNullableByDefault = true;
-    _lateSetter = _createSetter(name, fileUri, charOffset, setterReference,
+    _lateSetter = _createSetter(name, fileUri, charOffset, lateSetterReference,
         isCovariant: isCovariant);
   }
 
@@ -1251,8 +1255,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference,
+      Reference lateGetterReference,
+      Reference lateSetterReference,
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
@@ -1264,8 +1268,8 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
 }
@@ -1281,8 +1285,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference,
+      Reference lateGetterReference,
+      Reference lateSetterReference,
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
@@ -1294,8 +1298,8 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
 
@@ -1326,8 +1330,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference,
+      Reference lateGetterReference,
+      Reference lateSetterReference,
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
@@ -1339,8 +1343,8 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
 
@@ -1372,8 +1376,8 @@
       Reference fieldSetterReference,
       Reference lateIsSetGetterReference,
       Reference lateIsSetSetterReference,
-      Reference getterReference,
-      Reference setterReference,
+      Reference lateGetterReference,
+      Reference lateSetterReference,
       bool isCovariant,
       late_lowering.IsSetStrategy isSetStrategy)
       : super(
@@ -1385,8 +1389,8 @@
             fieldSetterReference,
             lateIsSetGetterReference,
             lateIsSetSetterReference,
-            getterReference,
-            setterReference,
+            lateGetterReference,
+            lateSetterReference,
             isCovariant,
             isSetStrategy);
   @override
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index eaabec0..9965154 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -1047,8 +1047,8 @@
               .isNonNullableByDefault /* depends on language version etc */,
           enableTripleShift:
               /* should this be on the library? */
-              /* this is what the constant evaluator does */
-              userCode
+              /* this is effectively what the constant evaluator does */
+              context.options
                   .isExperimentEnabledGlobally(ExperimentalFlag.tripleShift));
       String before = textualOutline(previousSource, scannerConfiguration,
           performModelling: true);
diff --git a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
index 86496d4..d3c6b5a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
@@ -335,7 +335,8 @@
               assert(
                   _combinedMemberSignatureType != null,
                   "No combined member signature found for "
-                  "${_mutualSubtypes.values.map((int i) => getMemberType(i))}");
+                  "${_mutualSubtypes.values.map((int i) => getMemberType(i))} "
+                  "for members ${members}");
             }
           }
           _neededNnbdTopMerge =
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index c4a855e..e3158d4 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2141,8 +2141,8 @@
     Reference fieldSetterReference;
     Reference lateIsSetGetterReference;
     Reference lateIsSetSetterReference;
-    Reference getterReference;
-    Reference setterReference;
+    Reference lateGetterReference;
+    Reference lateSetterReference;
     if (referencesFrom != null) {
       String nameToLookup = SourceFieldBuilder.createFieldName(
           FieldNameType.Field, name,
@@ -2172,7 +2172,7 @@
             indexedContainer.lookupGetterReference(lateIsSetNameName);
         lateIsSetSetterReference =
             indexedContainer.lookupSetterReference(lateIsSetNameName);
-        getterReference = indexedContainer.lookupGetterReference(new Name(
+        lateGetterReference = indexedContainer.lookupGetterReference(new Name(
             SourceFieldBuilder.createFieldName(FieldNameType.Getter, name,
                 isInstanceMember: isInstanceMember,
                 className: className,
@@ -2180,7 +2180,7 @@
                 extensionName: extensionName,
                 isSynthesized: fieldIsLateWithLowering),
             indexedContainer.library));
-        setterReference = indexedContainer.lookupSetterReference(new Name(
+        lateSetterReference = indexedContainer.lookupSetterReference(new Name(
             SourceFieldBuilder.createFieldName(FieldNameType.Setter, name,
                 isInstanceMember: isInstanceMember,
                 className: className,
@@ -2197,8 +2197,8 @@
         fieldSetterReference: fieldSetterReference,
         lateIsSetGetterReference: lateIsSetGetterReference,
         lateIsSetSetterReference: lateIsSetSetterReference,
-        getterReference: getterReference,
-        setterReference: setterReference);
+        lateGetterReference: lateGetterReference,
+        lateSetterReference: lateSetterReference);
     fieldBuilder.constInitializerToken = constInitializerToken;
     addBuilder(name, fieldBuilder, charOffset,
         getterReference: fieldGetterReference,
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart
new file mode 100644
index 0000000..420dd920
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  void method1(C c) {}
+  void method2(int a, int b) {}
+}
+
+class B {
+  void method1(Unresolved c) {}
+  void method2(int a) {}
+}
+
+class C {}
+
+abstract class D implements A, B {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.expect
new file mode 100644
index 0000000..c80806c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: 'Unresolved' isn't a type.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1(self::C c) → void {}
+  method method2(core::int a, core::int b) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1(invalid-type c) → void {}
+  method method2(core::int a) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.transformed.expect
new file mode 100644
index 0000000..c80806c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.strong.transformed.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: 'Unresolved' isn't a type.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1(self::C c) → void {}
+  method method2(core::int a, core::int b) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1(invalid-type c) → void {}
+  method method2(core::int a) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline.expect
new file mode 100644
index 0000000..a440beb
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline.expect
@@ -0,0 +1,15 @@
+class A {
+  void method1(C c) {}
+  void method2(int a, int b) {}
+}
+
+class B {
+  void method1(Unresolved c) {}
+  void method2(int a) {}
+}
+
+class C {}
+
+abstract class D implements A, B {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..4435f2b
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.textual_outline_modelled.expect
@@ -0,0 +1,15 @@
+abstract class D implements A, B {}
+
+class A {
+  void method1(C c) {}
+  void method2(int a, int b) {}
+}
+
+class B {
+  void method1(Unresolved c) {}
+  void method2(int a) {}
+}
+
+class C {}
+
+main() {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.expect
new file mode 100644
index 0000000..c80806c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: 'Unresolved' isn't a type.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1(self::C c) → void {}
+  method method2(core::int a, core::int b) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1(invalid-type c) → void {}
+  method method2(core::int a) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.outline.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.outline.expect
new file mode 100644
index 0000000..1fa2ce4
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.outline.expect
@@ -0,0 +1,49 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+  method method1(self::C c) → void
+    ;
+  method method2(core::int a, core::int b) → void
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+  method method1(invalid-type c) → void
+    ;
+  method method2(core::int a) → void
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.transformed.expect
new file mode 100644
index 0000000..c80806c
--- /dev/null
+++ b/pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart.weak.transformed.expect
@@ -0,0 +1,52 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: Type 'Unresolved' not found.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:17:16: Error: Class 'D' inherits multiple members named 'method2' with incompatible signatures.
+// Try adding a declaration of 'method2' to 'D'.
+// abstract class D implements A, B {}
+//                ^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:7:8: Context: This is one of the overridden members.
+//   void method2(int a, int b) {}
+//        ^^^^^^^
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:12:8: Context: This is one of the overridden members.
+//   void method2(int a) {}
+//        ^^^^^^^
+//
+// pkg/front_end/testcases/nnbd/invalid_combined_member_signature.dart:11:16: Error: 'Unresolved' isn't a type.
+//   void method1(Unresolved c) {}
+//                ^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+  method method1(self::C c) → void {}
+  method method2(core::int a, core::int b) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+  method method1(invalid-type c) → void {}
+  method method2(core::int a) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+abstract class D extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::D
+    : super core::Object::•()
+    ;
+  abstract member-signature method method1(invalid-type c) → void; -> self::A::method1
+}
+static method main() → dynamic {}
diff --git a/pkg/kernel/bin/size_breakdown.dart b/pkg/kernel/bin/size_breakdown.dart
index 979b828..79fbefa 100755
--- a/pkg/kernel/bin/size_breakdown.dart
+++ b/pkg/kernel/bin/size_breakdown.dart
@@ -64,9 +64,9 @@
     linkTableSize += byteOffset;
   }
 
-  Map<Uri, Source> readUriToSource(bool readCoverage) {
+  Map<Uri, Source> readUriToSource({bool readCoverage}) {
     uriToSourceSize -= byteOffset;
-    var result = super.readUriToSource(readCoverage);
+    var result = super.readUriToSource(readCoverage: readCoverage);
     uriToSourceSize += byteOffset;
     return result;
   }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 47f4628..b350f3f 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -2243,6 +2243,7 @@
 
   /// Reference to the constructor or the factory that this
   /// [RedirectingFactoryConstructor] redirects to.
+  // TODO(johnniwinther): Make this non-nullable.
   Reference? targetReference;
 
   /// [typeParameters] are duplicates of the type parameters of the enclosing
@@ -2630,7 +2631,7 @@
   ProcedureStubKind stubKind;
   Reference? stubTargetReference;
 
-  Procedure(Name? name, ProcedureKind kind, FunctionNode function,
+  Procedure(Name? name, ProcedureKind kind, FunctionNode? function,
       {bool isAbstract: false,
       bool isStatic: false,
       bool isExternal: false,
@@ -3694,7 +3695,8 @@
 /// The [fileOffset] of an [InvalidExpression] indicates the location in the
 /// tree where the expression occurs, rather than the location of the error.
 class InvalidExpression extends Expression {
-  String message;
+  // TODO(johnniwinther): Avoid using `null` as the empty string.
+  String? message;
 
   InvalidExpression(this.message);
 
@@ -3730,7 +3732,7 @@
   @override
   void toTextInternal(AstPrinter printer) {
     printer.write('<invalid:');
-    printer.write(message);
+    printer.write(message ?? '');
     printer.write('>');
   }
 }
@@ -12090,7 +12092,7 @@
 
 class SymbolConstant extends Constant {
   final String name;
-  final Reference libraryReference;
+  final Reference? libraryReference;
 
   SymbolConstant(this.name, this.libraryReference);
 
@@ -12116,9 +12118,8 @@
   @override
   void toTextInternal(AstPrinter printer) {
     printer.write('#');
-    // ignore: unnecessary_null_comparison
     if (printer.includeAuxiliaryProperties && libraryReference != null) {
-      printer.write(libraryNameToString(libraryReference.asLibrary));
+      printer.write(libraryNameToString(libraryReference!.asLibrary));
       printer.write('::');
     }
     printer.write(name);
@@ -12636,7 +12637,7 @@
 
   Procedure? get mainMethod => mainMethodName?.asProcedure;
 
-  void setMainMethodAndMode(Reference main, bool overwriteMainIfSet,
+  void setMainMethodAndMode(Reference? main, bool overwriteMainIfSet,
       NonNullableByDefaultCompiledMode mode) {
     if (_mainMethodName == null || overwriteMainIfSet) {
       _mainMethodName = main;
@@ -12718,7 +12719,7 @@
   String get tag;
 
   /// Mutable mapping between nodes and their metadata.
-  Map<TreeNode, T> get mapping;
+  Map<Node, T> get mapping;
 
   /// Write [metadata] object corresponding to the given [Node] into
   /// the given [BinarySink].
@@ -12749,7 +12750,7 @@
   /// Currently due to binary format specifics Catch and MapEntry nodes
   /// can't have metadata attached to them. Also, metadata is not saved on
   /// Block nodes inside BlockExpressions.
-  static bool isSupported(TreeNode node) {
+  static bool isSupported(Node node) {
     return !(node is MapEntry ||
         node is Catch ||
         (node is Block && node.parent is BlockExpression));
@@ -12796,7 +12797,7 @@
   /// Read List<Byte> from the source.
   List<int> readByteList();
 
-  CanonicalName readCanonicalNameReference();
+  CanonicalName? readNullableCanonicalNameReference();
   String readStringReference();
   Name readName();
   DartType readDartType();
@@ -12849,11 +12850,11 @@
   final List<int>? lineStarts;
 
   /// A UTF8 encoding of the original source file.
-  final List<int>? source;
+  final List<int> source;
 
-  final Uri importUri;
+  final Uri? importUri;
 
-  final Uri fileUri;
+  final Uri? fileUri;
 
   Set<Reference>? constantCoverageConstructors;
 
@@ -12865,16 +12866,13 @@
   /// number. The returned line contains no line separators.
   String? getTextLine(int line) {
     List<int>? lineStarts = this.lineStarts;
-    if (source == null ||
-        source!.isEmpty ||
-        lineStarts == null ||
-        lineStarts.isEmpty) {
+    if (source.isEmpty || lineStarts == null || lineStarts.isEmpty) {
       return null;
     }
     RangeError.checkValueInInterval(line, 1, lineStarts.length, 'line');
 
     String cachedText =
-        this.cachedText ??= utf8.decode(source!, allowMalformed: true);
+        this.cachedText ??= utf8.decode(source, allowMalformed: true);
     // -1 as line numbers start at 1.
     int index = line - 1;
     if (index + 1 == lineStarts.length) {
@@ -13113,7 +13111,7 @@
     return finish(combine2(value1, value2, hash));
   }
 
-  static int hash2(Object object1, Object object2) {
+  static int hash2(Object object1, Object? object2) {
     return combine2Finish(object2.hashCode, object2.hashCode, 0);
   }
 
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 911ea5a..7da0618 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.9
-
 library kernel.ast_from_binary;
 
 import 'dart:developer';
@@ -15,18 +13,19 @@
 import 'tag.dart';
 
 class ParseError {
-  String filename;
-  int byteIndex;
-  String message;
-  String path;
+  final String? filename;
+  final int byteIndex;
+  final String message;
+  final String path;
 
-  ParseError(this.message, {this.filename, this.byteIndex, this.path});
+  ParseError(this.message,
+      {required this.filename, required this.byteIndex, required this.path});
 
   String toString() => '$filename:$byteIndex: $message at $path';
 }
 
 class InvalidKernelVersionError {
-  final String filename;
+  final String? filename;
   final int version;
 
   InvalidKernelVersionError(this.filename, this.version);
@@ -78,17 +77,30 @@
 class _ComponentIndex {
   static const int numberOfFixedFields = 10;
 
-  int binaryOffsetForSourceTable;
-  int binaryOffsetForCanonicalNames;
-  int binaryOffsetForMetadataPayloads;
-  int binaryOffsetForMetadataMappings;
-  int binaryOffsetForStringTable;
-  int binaryOffsetForConstantTable;
-  int mainMethodReference;
-  NonNullableByDefaultCompiledMode compiledMode;
-  List<int> libraryOffsets;
-  int libraryCount;
-  int componentFileSizeInBytes;
+  final int binaryOffsetForSourceTable;
+  final int binaryOffsetForCanonicalNames;
+  final int binaryOffsetForMetadataPayloads;
+  final int binaryOffsetForMetadataMappings;
+  final int binaryOffsetForStringTable;
+  final int binaryOffsetForConstantTable;
+  final int mainMethodReference;
+  final NonNullableByDefaultCompiledMode compiledMode;
+  final List<int> libraryOffsets;
+  final int libraryCount;
+  final int componentFileSizeInBytes;
+
+  _ComponentIndex(
+      {required this.binaryOffsetForSourceTable,
+      required this.binaryOffsetForCanonicalNames,
+      required this.binaryOffsetForMetadataPayloads,
+      required this.binaryOffsetForMetadataMappings,
+      required this.binaryOffsetForStringTable,
+      required this.binaryOffsetForConstantTable,
+      required this.mainMethodReference,
+      required this.compiledMode,
+      required this.libraryOffsets,
+      required this.libraryCount,
+      required this.componentFileSizeInBytes});
 }
 
 class SubComponentView {
@@ -119,17 +131,17 @@
   int switchCaseStackBase = 0;
   final List<SwitchCase> switchCaseStack = <SwitchCase>[];
   final List<TypeParameter> typeParameterStack = <TypeParameter>[];
-  final String filename;
+  final String? filename;
   final List<int> _bytes;
   int _byteOffset = 0;
   final List<String> _stringTable = <String>[];
-  final List<Uri> _sourceUriTable = <Uri>[];
+  final List<Uri?> _sourceUriTable = <Uri>[];
   Map<int, Constant> _constantTable = <int, Constant>{};
-  List<CanonicalName> _linkTable;
+  late List<CanonicalName> _linkTable;
   int _transformerFlags = 0;
-  Library _currentLibrary;
+  Library? _currentLibrary;
   int _componentStartOffset = 0;
-  NonNullableByDefaultCompiledMode compilationMode;
+  NonNullableByDefaultCompiledMode? compilationMode;
 
   // If something goes wrong, this list should indicate what library,
   // class, and member was being built.
@@ -149,7 +161,7 @@
 
   /// [stringInterner] (optional) may be used to allow components to share
   /// instances of [String] that have the same contents.
-  final StringInterner /*?*/ stringInterner;
+  final StringInterner? stringInterner;
 
   /// When creating lists that *might* be growable, use this boolean as the
   /// setting to pass to `growable` so the dill can be loaded in a more compact
@@ -162,7 +174,7 @@
       {this.filename,
       bool disableLazyReading = false,
       bool disableLazyClassReading = false,
-      bool alwaysCreateNewNamedNodes,
+      bool? alwaysCreateNewNamedNodes,
       this.stringInterner,
       this.useGrowableLists = true})
       : _disableLazyReading = disableLazyReading,
@@ -211,18 +223,19 @@
   }
 
   final Float64List _doubleBuffer = new Float64List(1);
-  Uint8List _doubleBufferUint8;
+  Uint8List? _doubleBufferUint8;
 
   double readDouble() {
-    _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
-    _doubleBufferUint8[0] = readByte();
-    _doubleBufferUint8[1] = readByte();
-    _doubleBufferUint8[2] = readByte();
-    _doubleBufferUint8[3] = readByte();
-    _doubleBufferUint8[4] = readByte();
-    _doubleBufferUint8[5] = readByte();
-    _doubleBufferUint8[6] = readByte();
-    _doubleBufferUint8[7] = readByte();
+    Uint8List doubleBufferUint8 =
+        _doubleBufferUint8 ??= _doubleBuffer.buffer.asUint8List();
+    doubleBufferUint8[0] = readByte();
+    doubleBufferUint8[1] = readByte();
+    doubleBufferUint8[2] = readByte();
+    doubleBufferUint8[3] = readByte();
+    doubleBufferUint8[4] = readByte();
+    doubleBufferUint8[5] = readByte();
+    doubleBufferUint8[6] = readByte();
+    doubleBufferUint8[7] = readByte();
     return _doubleBuffer[0];
   }
 
@@ -244,7 +257,7 @@
   String readStringEntry(int numBytes) {
     String string = _readStringEntry(numBytes);
     if (stringInterner == null) return string;
-    return stringInterner.internString(string);
+    return stringInterner!.internString(string);
   }
 
   String _readStringEntry(int numBytes) {
@@ -309,7 +322,7 @@
   }
 
   /// Reads metadata for the given [node].
-  Node _associateMetadata(Node node, int nodeOffset) {
+  T _associateMetadata<T extends Node>(T node, int nodeOffset) {
     // Default reader ignores metadata section entirely.
     return node;
   }
@@ -393,7 +406,7 @@
   }
 
   Constant _readSymbolConstant() {
-    Reference libraryReference = readLibraryReference(allowNull: true);
+    Reference? libraryReference = readNullableLibraryReference();
     return new SymbolConstant(readStringReference(), libraryReference);
   }
 
@@ -423,12 +436,13 @@
   }
 
   Constant _readInstanceConstant() {
-    final Reference classReference = readClassReference();
+    final Reference classReference = readNonNullClassReference();
     final List<DartType> typeArguments = readDartTypeList();
     final int fieldValueCount = readUInt30();
     final Map<Reference, Constant> fieldValues = <Reference, Constant>{};
     for (int i = 0; i < fieldValueCount; i++) {
-      final Reference fieldRef = readCanonicalNameReference().getReference();
+      final Reference fieldRef =
+          readNonNullCanonicalNameReference().getReference();
       final Constant constant = readConstantReference();
       fieldValues[fieldRef] = constant;
     }
@@ -443,7 +457,8 @@
   }
 
   Constant _readTearOffConstant() {
-    final Reference reference = readCanonicalNameReference().getReference();
+    final Reference reference =
+        readNonNullCanonicalNameReference().getReference();
     return new TearOffConstant.byReference(reference);
   }
 
@@ -459,9 +474,9 @@
 
   Constant readConstantReference() {
     final int offset = readUInt30();
-    Constant constant = _constantTable[offset];
-    assert(constant != null);
-    return constant;
+    Constant? constant = _constantTable[offset];
+    assert(constant != null, "No constant found at offset $offset.");
+    return constant!;
   }
 
   List<Constant> _readConstantReferenceList() {
@@ -470,7 +485,7 @@
         growable: useGrowableLists);
   }
 
-  Uri readUriReference() {
+  Uri? readUriReference() {
     return _sourceUriTable[readUInt30()];
   }
 
@@ -484,7 +499,7 @@
         growable: useGrowableLists);
   }
 
-  String readStringOrNullIfEmpty() {
+  String? readStringOrNullIfEmpty() {
     String string = readStringReference();
     return string.isEmpty ? null : string;
   }
@@ -500,7 +515,7 @@
     }
   }
 
-  List<Expression> readAnnotationList(TreeNode parent) {
+  List<Expression> readAnnotationList(TreeNode? parent) {
     int length = readUInt30();
     if (length == 0) return const <Expression>[];
     return new List<Expression>.generate(
@@ -599,9 +614,9 @@
   /// If [createView] is true, returns a list of [SubComponentView] - one for
   /// each concatenated dill - each of which knowing where in the combined dill
   /// it came from. If [createView] is false null will be returned.
-  List<SubComponentView> readComponent(Component component,
+  List<SubComponentView>? readComponent(Component component,
       {bool checkCanonicalNames: false, bool createView: false}) {
-    return Timeline.timeSync<List<SubComponentView>>(
+    return Timeline.timeSync<List<SubComponentView>?>(
         "BinaryBuilder.readComponent", () {
       _checkEmptyInput();
 
@@ -626,16 +641,16 @@
         _disableLazyClassReading = true;
       }
       int componentFileIndex = 0;
-      List<SubComponentView> views;
+      List<SubComponentView>? views;
       if (createView) {
         views = <SubComponentView>[];
       }
       while (_byteOffset < _bytes.length) {
-        SubComponentView view = _readOneComponent(
+        SubComponentView? view = _readOneComponent(
             component, componentFileSizes[componentFileIndex],
             createView: createView);
         if (createView) {
-          views.add(view);
+          views!.add(view!);
         }
         ++componentFileIndex;
       }
@@ -696,7 +711,7 @@
   }
 
   void _checkCanonicalNameChildren(CanonicalName parent) {
-    Iterable<CanonicalName> parentChildren = parent.childrenOrNull;
+    Iterable<CanonicalName>? parentChildren = parent.childrenOrNull;
     if (parentChildren != null) {
       for (CanonicalName child in parentChildren) {
         if (child.name != '@methods' &&
@@ -722,11 +737,11 @@
             }
           }
           if (checkReferenceNode) {
-            if (child.reference.canonicalName != child) {
+            if (child.reference!.canonicalName != child) {
               throw new CanonicalNameError(
                   "Canonical name and reference doesn't agree.");
             }
-            if (child.reference.node == null) {
+            if (child.reference!.node == null) {
               throw buildCanonicalNameError(
                   "Reference is null (${child.name}) ($child).", child);
             }
@@ -741,7 +756,7 @@
       String message, CanonicalName problemNode) {
     // Special-case missing sdk entries as that is probably a change to the
     // platform - that's something we might want to react differently to.
-    String libraryUri = problemNode?.nonRootTop?.name ?? "";
+    String libraryUri = problemNode.nonRootTop?.name ?? "";
     if (libraryUri.startsWith("dart:")) {
       return new CanonicalNameSdkError(message);
     }
@@ -751,48 +766,56 @@
   _ComponentIndex _readComponentIndex(int componentFileSize) {
     int savedByteIndex = _byteOffset;
 
-    _ComponentIndex result = new _ComponentIndex();
-
     // There are two fields: file size and library count.
     _byteOffset = _componentStartOffset + componentFileSize - (2) * 4;
-    result.libraryCount = readUint32();
+    int libraryCount = readUint32();
     // Library offsets are used for start and end offsets, so there is one extra
     // element that this the end offset of the last library
-    result.libraryOffsets = new List<int>.filled(
-        result.libraryCount + 1,
+    List<int> libraryOffsets = new List<int>.filled(
+        libraryCount + 1,
         // Use `-1` as a dummy default value.
         -1,
         growable: false);
-    result.componentFileSizeInBytes = readUint32();
-    if (result.componentFileSizeInBytes != componentFileSize) {
+    int componentFileSizeInBytes = readUint32();
+    if (componentFileSizeInBytes != componentFileSize) {
       throw "Malformed binary: This component file's component index indicates "
           "that the file size should be $componentFileSize but other component "
           "indexes has indicated that the size should be "
-          "${result.componentFileSizeInBytes}.";
+          "${componentFileSizeInBytes}.";
     }
 
     // Skip to the start of the index.
     _byteOffset -=
-        ((result.libraryCount + 1) + _ComponentIndex.numberOfFixedFields) * 4;
+        ((libraryCount + 1) + _ComponentIndex.numberOfFixedFields) * 4;
 
     // Now read the component index.
-    result.binaryOffsetForSourceTable = _componentStartOffset + readUint32();
-    result.binaryOffsetForCanonicalNames = _componentStartOffset + readUint32();
-    result.binaryOffsetForMetadataPayloads =
-        _componentStartOffset + readUint32();
-    result.binaryOffsetForMetadataMappings =
-        _componentStartOffset + readUint32();
-    result.binaryOffsetForStringTable = _componentStartOffset + readUint32();
-    result.binaryOffsetForConstantTable = _componentStartOffset + readUint32();
-    result.mainMethodReference = readUint32();
-    result.compiledMode = NonNullableByDefaultCompiledMode.values[readUint32()];
-    for (int i = 0; i < result.libraryCount + 1; ++i) {
-      result.libraryOffsets[i] = _componentStartOffset + readUint32();
+    int binaryOffsetForSourceTable = _componentStartOffset + readUint32();
+    int binaryOffsetForCanonicalNames = _componentStartOffset + readUint32();
+    int binaryOffsetForMetadataPayloads = _componentStartOffset + readUint32();
+    int binaryOffsetForMetadataMappings = _componentStartOffset + readUint32();
+    int binaryOffsetForStringTable = _componentStartOffset + readUint32();
+    int binaryOffsetForConstantTable = _componentStartOffset + readUint32();
+    int mainMethodReference = readUint32();
+    NonNullableByDefaultCompiledMode compiledMode =
+        NonNullableByDefaultCompiledMode.values[readUint32()];
+    for (int i = 0; i < libraryCount + 1; ++i) {
+      libraryOffsets[i] = _componentStartOffset + readUint32();
     }
 
     _byteOffset = savedByteIndex;
 
-    return result;
+    return new _ComponentIndex(
+        libraryCount: libraryCount,
+        libraryOffsets: libraryOffsets,
+        componentFileSizeInBytes: componentFileSizeInBytes,
+        binaryOffsetForSourceTable: binaryOffsetForSourceTable,
+        binaryOffsetForCanonicalNames: binaryOffsetForCanonicalNames,
+        binaryOffsetForMetadataPayloads: binaryOffsetForMetadataPayloads,
+        binaryOffsetForMetadataMappings: binaryOffsetForMetadataMappings,
+        binaryOffsetForStringTable: binaryOffsetForStringTable,
+        binaryOffsetForConstantTable: binaryOffsetForConstantTable,
+        mainMethodReference: mainMethodReference,
+        compiledMode: compiledMode);
   }
 
   void _readOneComponentSource(Component component, int componentFileSize) {
@@ -814,13 +837,14 @@
     _ComponentIndex index = _readComponentIndex(componentFileSize);
 
     _byteOffset = index.binaryOffsetForSourceTable;
-    Map<Uri, Source> uriToSource = readUriToSource(/* readCoverage = */ false);
+    Map<Uri?, Source> uriToSource = readUriToSource(readCoverage: false);
     _mergeUriToSource(component.uriToSource, uriToSource);
 
     _byteOffset = _componentStartOffset + componentFileSize;
   }
 
-  SubComponentView _readOneComponent(Component component, int componentFileSize,
+  SubComponentView? _readOneComponent(
+      Component component, int componentFileSize,
       {bool createView: false}) {
     _componentStartOffset = _byteOffset;
 
@@ -836,10 +860,10 @@
 
     _readAndVerifySdkHash();
 
-    List<String> problemsAsJson = readListOfStrings();
+    List<String>? problemsAsJson = readListOfStrings();
     if (problemsAsJson != null) {
       component.problemsAsJson ??= <String>[];
-      component.problemsAsJson.addAll(problemsAsJson);
+      component.problemsAsJson!.addAll(problemsAsJson);
     }
 
     // Read component index from the end of this ComponentFiles serialized data.
@@ -863,7 +887,7 @@
     _associateMetadata(component, _componentStartOffset);
 
     _byteOffset = index.binaryOffsetForSourceTable;
-    Map<Uri, Source> uriToSource = readUriToSource(/* readCoverage = */ true);
+    Map<Uri?, Source> uriToSource = readUriToSource(readCoverage: true);
     _mergeUriToSource(component.uriToSource, uriToSource);
 
     _byteOffset = index.binaryOffsetForConstantTable;
@@ -871,7 +895,7 @@
 
     int numberOfLibraries = index.libraryCount;
 
-    SubComponentView result;
+    SubComponentView? result;
     if (createView) {
       result = new SubComponentView(
           new List<Library>.generate(numberOfLibraries, (int i) {
@@ -887,9 +911,9 @@
       }
     }
 
-    Reference mainMethod =
-        getMemberReferenceFromInt(index.mainMethodReference, allowNull: true);
-    component.setMainMethodAndMode(mainMethod, false, compilationMode);
+    Reference? mainMethod =
+        getNullableMemberReferenceFromInt(index.mainMethodReference);
+    component.setMainMethodAndMode(mainMethod, false, compilationMode!);
 
     _byteOffset = _componentStartOffset + componentFileSize;
 
@@ -899,7 +923,7 @@
   }
 
   /// Read a list of strings. If the list is empty, [null] is returned.
-  List<String> readListOfStrings() {
+  List<String>? readListOfStrings() {
     int length = readUInt30();
     if (length == 0) return null;
     return new List<String>.generate(length, (_) => readString(),
@@ -911,17 +935,18 @@
   /// [readCoverage] is true, otherwise coverage will be skipped. Note also that
   /// if [readCoverage] is true, references are read and that the link table
   /// thus has to be read first.
-  Map<Uri, Source> readUriToSource(bool readCoverage) {
+  Map<Uri?, Source> readUriToSource({required bool readCoverage}) {
+    // ignore: unnecessary_null_comparison
     assert(!readCoverage || (readCoverage && _linkTable != null));
 
     int length = readUint32();
 
     // Read data.
     _sourceUriTable.length = length;
-    Map<Uri, Source> uriToSource = <Uri, Source>{};
+    Map<Uri?, Source> uriToSource = <Uri, Source>{};
     for (int i = 0; i < length; ++i) {
       String uriString = readString();
-      Uri uri = uriString.isEmpty ? null : Uri.parse(uriString);
+      Uri? uri = uriString.isEmpty ? null : Uri.parse(uriString);
       _sourceUriTable[i] = uri;
       Uint8List sourceCode = readByteList();
       int lineCount = readUInt30();
@@ -937,21 +962,22 @@
         previousLineStart = lineStart;
       }
       String importUriString = readString();
-      Uri importUri =
+      Uri? importUri =
           importUriString.isEmpty ? null : Uri.parse(importUriString);
 
-      Set<Reference> coverageConstructors;
+      Set<Reference>? coverageConstructors;
       {
         int constructorCoverageCount = readUInt30();
-        if (readCoverage) {
-          coverageConstructors =
-              constructorCoverageCount == 0 ? null : new Set<Reference>();
-          for (int j = 0; j < constructorCoverageCount; ++j) {
-            coverageConstructors.add(readMemberReference());
-          }
-        } else {
-          for (int j = 0; j < constructorCoverageCount; ++j) {
-            skipMemberReference();
+        if (constructorCoverageCount > 0) {
+          if (readCoverage) {
+            coverageConstructors = new Set<Reference>();
+            for (int j = 0; j < constructorCoverageCount; ++j) {
+              coverageConstructors.add(readNonNullMemberReference());
+            }
+          } else {
+            for (int j = 0; j < constructorCoverageCount; ++j) {
+              skipMemberReference();
+            }
           }
         }
       }
@@ -971,14 +997,14 @@
   // source with an empty source. Empty sources may be introduced by
   // synthetic, copy-down implementations such as mixin applications or
   // noSuchMethod forwarders.
-  void _mergeUriToSource(Map<Uri, Source> dst, Map<Uri, Source> src) {
+  void _mergeUriToSource(Map<Uri?, Source> dst, Map<Uri?, Source> src) {
     if (dst.isEmpty) {
       // Fast path for the common case of one component per binary.
       dst.addAll(src);
     } else {
-      src.forEach((Uri key, Source value) {
-        Source originalDestinationSource = dst[key];
-        Source mergeFrom;
+      src.forEach((Uri? key, Source value) {
+        Source? originalDestinationSource = dst[key];
+        Source? mergeFrom;
         Source mergeTo;
         if (value.source.isNotEmpty || originalDestinationSource == null) {
           dst[key] = value;
@@ -1000,9 +1026,9 @@
         } else if (mergeFrom?.constantCoverageConstructors == null) {
           // Nothing to do.
         } else {
-          // Bot are non-null: Merge.
-          mergeTo.constantCoverageConstructors
-              .addAll(mergeFrom.constantCoverageConstructors);
+          // Both are non-null: Merge.
+          mergeTo.constantCoverageConstructors!
+              .addAll(mergeFrom!.constantCoverageConstructors!);
         }
       });
     }
@@ -1012,71 +1038,99 @@
     readUInt30();
   }
 
-  CanonicalName readCanonicalNameReference() {
+  CanonicalName? readNullableCanonicalNameReference() {
     int index = readUInt30();
     if (index == 0) return null;
     return _linkTable[index - 1];
   }
 
-  CanonicalName getCanonicalNameReferenceFromInt(int index) {
+  CanonicalName readNonNullCanonicalNameReference() {
+    CanonicalName? canonicalName = readNullableCanonicalNameReference();
+    if (canonicalName == null) {
+      throw new StateError('No canonical name found.');
+    }
+    return canonicalName;
+  }
+
+  CanonicalName? getNullableCanonicalNameReferenceFromInt(int index) {
     if (index == 0) return null;
     return _linkTable[index - 1];
   }
 
-  Reference readLibraryReference({bool allowNull: false}) {
-    CanonicalName canonicalName = readCanonicalNameReference();
+  Reference? readNullableLibraryReference() {
+    CanonicalName? canonicalName = readNullableCanonicalNameReference();
+    return canonicalName?.getReference();
+  }
+
+  Reference readNonNullLibraryReference() {
+    CanonicalName? canonicalName = readNullableCanonicalNameReference();
     if (canonicalName != null) return canonicalName.getReference();
-    if (allowNull) return null;
     throw 'Expected a library reference to be valid but was `null`.';
   }
 
   LibraryDependency readLibraryDependencyReference() {
     int index = readUInt30();
-    return _currentLibrary.dependencies[index];
+    return _currentLibrary!.dependencies[index];
   }
 
-  Reference readClassReference({bool allowNull: false}) {
-    CanonicalName name = readCanonicalNameReference();
-    if (name == null && !allowNull) {
+  Reference? readNullableClassReference() {
+    CanonicalName? name = readNullableCanonicalNameReference();
+    return name?.getReference();
+  }
+
+  Reference readNonNullClassReference() {
+    CanonicalName? name = readNullableCanonicalNameReference();
+    if (name == null) {
       throw 'Expected a class reference to be valid but was `null`.';
     }
-    return name?.getReference();
+    return name.getReference();
   }
 
   void skipMemberReference() {
     skipCanonicalNameReference();
   }
 
-  Reference readMemberReference({bool allowNull: false}) {
-    CanonicalName name = readCanonicalNameReference();
-    if (name == null && !allowNull) {
-      throw 'Expected a member reference to be valid but was `null`.';
-    }
+  Reference? readNullableMemberReference() {
+    CanonicalName? name = readNullableCanonicalNameReference();
     return name?.getReference();
   }
 
-  Reference readInstanceMemberReference({bool allowNull: false}) {
-    Reference reference = readMemberReference(allowNull: allowNull);
-    readMemberReference(allowNull: true); // Skip origin
+  Reference readNonNullMemberReference() {
+    CanonicalName? name = readNullableCanonicalNameReference();
+    if (name == null) {
+      throw 'Expected a member reference to be valid but was `null`.';
+    }
+    return name.getReference();
+  }
+
+  Reference? readNullableInstanceMemberReference() {
+    Reference? reference = readNullableMemberReference();
+    readNullableMemberReference(); // Skip origin
     return reference;
   }
 
-  Reference getMemberReferenceFromInt(int index, {bool allowNull: false}) {
-    CanonicalName name = getCanonicalNameReferenceFromInt(index);
-    if (name == null && !allowNull) {
-      throw 'Expected a member reference to be valid but was `null`.';
-    }
-    return name?.getReference();
+  Reference readNonNullInstanceMemberReference() {
+    Reference reference = readNonNullMemberReference();
+    readNullableMemberReference(); // Skip origin
+    return reference;
   }
 
-  Reference readTypedefReference() {
-    return readCanonicalNameReference()?.getReference();
+  Reference? getNullableMemberReferenceFromInt(int index) {
+    return getNullableCanonicalNameReferenceFromInt(index)?.getReference();
+  }
+
+  Reference? readNullableTypedefReference() {
+    return readNullableCanonicalNameReference()?.getReference();
+  }
+
+  Reference readNonNullTypedefReference() {
+    return readNonNullCanonicalNameReference().getReference();
   }
 
   Name readName() {
     String text = readStringReference();
     if (text.isNotEmpty && text[0] == '_') {
-      return new Name.byReference(text, readLibraryReference());
+      return new Name.byReference(text, readNonNullLibraryReference());
     } else {
       return new Name(text);
     }
@@ -1122,9 +1176,9 @@
     int languageVersionMajor = readUInt30();
     int languageVersionMinor = readUInt30();
 
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Library library = reference.node;
+    Library? library = reference.node as Library?;
     if (alwaysCreateNewNamedNodes) {
       library = null;
     }
@@ -1134,12 +1188,12 @@
       component.libraries.add(library..parent = component);
     }
     _currentLibrary = library;
-    String name = readStringOrNullIfEmpty();
+    String? name = readStringOrNullIfEmpty();
 
     // TODO(jensj): We currently save (almost the same) uri twice.
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
 
-    List<String> problemsAsJson = readListOfStrings();
+    List<String>? problemsAsJson = readListOfStrings();
 
     library.flags = flags;
     library.setLanguageVersion(
@@ -1156,7 +1210,7 @@
         "into component with mode $compilationMode");
 
     assert(() {
-      debugPath.add(library.name ?? library.importUri?.toString() ?? 'library');
+      debugPath.add(library!.name ?? library.importUri.toString());
       return true;
     }());
 
@@ -1201,8 +1255,8 @@
     int fileOffset = readOffset();
     int flags = readByte();
     List<Expression> annotations = readExpressionList();
-    Reference targetLibrary = readLibraryReference(allowNull: true);
-    String prefixName = readStringOrNullIfEmpty();
+    Reference targetLibrary = readNonNullLibraryReference();
+    String? prefixName = readStringOrNullIfEmpty();
     List<Combinator> names = readCombinatorList();
     return new LibraryDependency.byReference(
         flags, annotations, targetLibrary, prefixName, names)
@@ -1215,7 +1269,7 @@
     if (numExportedReference != 0) {
       library.additionalExports.clear();
       for (int i = 0; i < numExportedReference; i++) {
-        CanonicalName exportedName = readCanonicalNameReference();
+        CanonicalName exportedName = readNonNullCanonicalNameReference();
         Reference reference = exportedName.getReference();
         library.additionalExports.add(reference);
       }
@@ -1254,18 +1308,18 @@
   }
 
   Typedef readTypedef() {
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Typedef node = reference.node;
+    Typedef? node = reference.node as Typedef?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    if (node == null) {
-      node = new Typedef(null, null, reference: reference);
-    }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int fileOffset = readOffset();
     String name = readStringReference();
+    if (node == null) {
+      node = new Typedef(name, null, reference: reference);
+    }
     node.annotations = readAnnotationList(node);
     readAndPushTypeParameterList(node.typeParameters, node);
     DartType type = readDartType();
@@ -1302,13 +1356,13 @@
         growable: false);
     _byteOffset = savedByteOffset;
 
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Class node = reference.node;
+    Class? node = reference.node as Class?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int startFileOffset = readOffset();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
@@ -1324,15 +1378,15 @@
     node.flags = flags;
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name ?? 'normal-class');
+      debugPath.add(name);
       return true;
     }());
 
     assert(typeParameterStack.length == 0);
 
     readAndPushTypeParameterList(node.typeParameters, node);
-    Supertype supertype = readSupertypeOption();
-    Supertype mixedInType = readSupertypeOption();
+    Supertype? supertype = readSupertypeOption();
+    Supertype? mixedInType = readSupertypeOption();
     _fillNonTreeNodeList(node.implementedTypes, readSupertype);
     if (_disableLazyClassReading) {
       readClassPartialContent(node, procedureOffsets);
@@ -1341,6 +1395,7 @@
     }
 
     typeParameterStack.length = 0;
+    // ignore: unnecessary_null_comparison
     assert(debugPath.removeLast() != null);
     node.name = name;
     node.fileUri = fileUri;
@@ -1357,9 +1412,9 @@
     int tag = readByte();
     assert(tag == Tag.Extension);
 
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Extension node = reference.node;
+    Extension? node = reference.node as Extension?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
@@ -1373,7 +1428,7 @@
       return true;
     }());
 
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     node.fileOffset = readOffset();
 
     readAndPushTypeParameterList(node.typeParameters, node);
@@ -1390,7 +1445,7 @@
       Name name = readName();
       int kind = readByte();
       int flags = readByte();
-      CanonicalName canonicalName = readCanonicalNameReference();
+      CanonicalName canonicalName = readNonNullCanonicalNameReference();
       node.members[i] = new ExtensionMemberDescriptor(
           name: name,
           kind: ExtensionMemberKind.values[kind],
@@ -1420,7 +1475,7 @@
   void _setLazyLoadClass(Class node, List<int> procedureOffsets) {
     final int savedByteOffset = _byteOffset;
     final int componentStartOffset = _componentStartOffset;
-    final Library currentLibrary = _currentLibrary;
+    final Library? currentLibrary = _currentLibrary;
     node.lazyBuilder = () {
       _byteOffset = savedByteOffset;
       _currentLibrary = currentLibrary;
@@ -1447,11 +1502,11 @@
   Field readField() {
     int tag = readByte();
     assert(tag == Tag.Field);
-    CanonicalName getterCanonicalName = readCanonicalNameReference();
+    CanonicalName getterCanonicalName = readNonNullCanonicalNameReference();
     Reference getterReference = getterCanonicalName.getReference();
-    CanonicalName setterCanonicalName = readCanonicalNameReference();
-    Reference setterReference = setterCanonicalName?.getReference();
-    Field node = getterReference.node;
+    CanonicalName? setterCanonicalName = readNullableCanonicalNameReference();
+    Reference? setterReference = setterCanonicalName?.getReference();
+    Field? node = getterReference.node as Field?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
@@ -1463,18 +1518,18 @@
         node = new Field.immutable(null, getterReference: getterReference);
       }
     }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readUInt30();
     Name name = readName();
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.text ?? 'field');
+      debugPath.add(name.text);
       return true;
     }());
     DartType type = readDartType();
-    Expression initializer = readExpressionOption();
+    Expression? initializer = readExpressionOption();
     int transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
     node.fileOffset = fileOffset;
@@ -1493,16 +1548,16 @@
   Constructor readConstructor() {
     int tag = readByte();
     assert(tag == Tag.Constructor);
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Constructor node = reference.node;
+    Constructor? node = reference.node as Constructor?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
     if (node == null) {
       node = new Constructor(null, reference: reference);
     }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int startFileOffset = readOffset();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
@@ -1510,7 +1565,7 @@
     Name name = readName();
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.text ?? 'constructor');
+      debugPath.add(name.text);
       return true;
     }());
     FunctionNode function = readFunctionNode();
@@ -1535,13 +1590,13 @@
   Procedure readProcedure(int endOffset) {
     int tag = readByte();
     assert(tag == Tag.Procedure);
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    Procedure node = reference.node;
+    Procedure? node = reference.node as Procedure?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int startFileOffset = readOffset();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
@@ -1557,7 +1612,7 @@
     Name name = readName();
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.text ?? 'procedure');
+      debugPath.add(name.text);
       return true;
     }());
     int functionNodeSize = endOffset - _byteOffset;
@@ -1565,8 +1620,8 @@
     bool readFunctionNodeNow =
         (kind == ProcedureKind.Factory && functionNodeSize <= 50) ||
             _disableLazyReading;
-    Reference stubTargetReference = readMemberReference(allowNull: true);
-    FunctionNode function =
+    Reference? stubTargetReference = readNullableMemberReference();
+    FunctionNode? function =
         readFunctionNodeOption(!readFunctionNodeNow, endOffset);
     int transformerFlags = getAndResetTransformerFlags();
     assert(((_) => true)(debugPath.removeLast()));
@@ -1585,7 +1640,7 @@
 
     assert((node.stubKind == ProcedureStubKind.ConcreteForwardingStub &&
             node.stubTargetReference != null) ||
-        !(node.isForwardingStub && node.function.body != null));
+        !(node.isForwardingStub && node.function!.body != null));
     assert(!(node.isMemberSignature && node.stubTargetReference == null),
         "No member signature origin for member signature $node.");
     return node;
@@ -1594,26 +1649,27 @@
   RedirectingFactoryConstructor readRedirectingFactoryConstructor() {
     int tag = readByte();
     assert(tag == Tag.RedirectingFactoryConstructor);
-    CanonicalName canonicalName = readCanonicalNameReference();
+    CanonicalName canonicalName = readNonNullCanonicalNameReference();
     Reference reference = canonicalName.getReference();
-    RedirectingFactoryConstructor node = reference.node;
+    RedirectingFactoryConstructor? node =
+        reference.node as RedirectingFactoryConstructor?;
     if (alwaysCreateNewNamedNodes) {
       node = null;
     }
     if (node == null) {
       node = new RedirectingFactoryConstructor(null, reference: reference);
     }
-    Uri fileUri = readUriReference();
+    Uri? fileUri = readUriReference();
     int fileOffset = readOffset();
     int fileEndOffset = readOffset();
     int flags = readByte();
     Name name = readName();
     List<Expression> annotations = readAnnotationList(node);
     assert(() {
-      debugPath.add(node.name?.text ?? 'redirecting-factory-constructor');
+      debugPath.add(name.text);
       return true;
     }());
-    Reference targetReference = readMemberReference();
+    Reference targetReference = readNonNullMemberReference();
     List<DartType> typeArguments = readDartTypeList();
     int typeParameterStackHeight = typeParameterStack.length;
     List<TypeParameter> typeParameters = readAndPushTypeParameterList();
@@ -1666,7 +1722,7 @@
   }
 
   Initializer _readFieldInitializer(bool isSynthetic) {
-    Reference reference = readMemberReference();
+    Reference reference = readNonNullMemberReference();
     Expression value = readExpression();
     return new FieldInitializer.byReference(reference, value)
       ..isSynthetic = isSynthetic;
@@ -1674,7 +1730,7 @@
 
   Initializer _readSuperInitializer(bool isSynthetic) {
     int offset = readOffset();
-    Reference reference = readMemberReference();
+    Reference reference = readNonNullMemberReference();
     Arguments arguments = readArguments();
     return new SuperInitializer.byReference(reference, arguments)
       ..isSynthetic = isSynthetic
@@ -1684,7 +1740,7 @@
   Initializer _readRedirectingInitializer() {
     int offset = readOffset();
     return new RedirectingInitializer.byReference(
-        readMemberReference(), readArguments())
+        readNonNullMemberReference(), readArguments())
       ..fileOffset = offset;
   }
 
@@ -1693,10 +1749,10 @@
   }
 
   Initializer _readAssertInitializer() {
-    return new AssertInitializer(readStatement());
+    return new AssertInitializer(readStatement() as AssertStatement);
   }
 
-  FunctionNode readFunctionNodeOption(bool lazyLoadBody, int outerEndOffset) {
+  FunctionNode? readFunctionNodeOption(bool lazyLoadBody, int outerEndOffset) {
     return readAndCheckOptionTag()
         ? readFunctionNode(
             lazyLoadBody: lazyLoadBody, outerEndOffset: outerEndOffset)
@@ -1719,7 +1775,7 @@
     List<VariableDeclaration> positional = readAndPushVariableDeclarationList();
     List<VariableDeclaration> named = readAndPushVariableDeclarationList();
     DartType returnType = readDartType();
-    DartType futureValueType = readDartTypeOption();
+    DartType? futureValueType = readDartTypeOption();
     int oldLabelStackBase = labelStackBase;
     int oldSwitchCaseStackBase = switchCaseStackBase;
 
@@ -1728,7 +1784,7 @@
           2; // e.g. outline has Tag.Something and Tag.EmptyStatement
     }
 
-    Statement body;
+    Statement? body;
     if (!lazyLoadBody) {
       labelStackBase = labelStack.length;
       switchCaseStackBase = switchCaseStack.length;
@@ -1766,7 +1822,7 @@
     final int componentStartOffset = _componentStartOffset;
     final List<TypeParameter> typeParameters = typeParameterStack.toList();
     final List<VariableDeclaration> variables = variableStack.toList();
-    final Library currentLibrary = _currentLibrary;
+    final Library currentLibrary = _currentLibrary!;
     result.lazyBuilder = () {
       _byteOffset = savedByteOffset;
       _currentLibrary = currentLibrary;
@@ -1782,8 +1838,8 @@
       switchCaseStackBase = oldSwitchCaseStackBase;
       variableStack.length = variableStackHeight;
       typeParameterStack.clear();
-      if (result.parent is Procedure) {
-        Procedure parent = result.parent;
+      TreeNode? parent = result.parent;
+      if (parent is Procedure) {
         parent.transformerFlags |= getAndResetTransformerFlags();
       }
     };
@@ -1828,7 +1884,7 @@
         growable: useGrowableLists);
   }
 
-  Expression readExpressionOption() {
+  Expression? readExpressionOption() {
     return readAndCheckOptionTag() ? readExpression() : null;
   }
 
@@ -2028,8 +2084,8 @@
 
   Expression _readPropertyGet() {
     int offset = readOffset();
-    return new PropertyGet.byReference(readExpression(), readName(),
-        readInstanceMemberReference(allowNull: true))
+    return new PropertyGet.byReference(
+        readExpression(), readName(), readNullableInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2038,7 +2094,7 @@
     int offset = readOffset();
     return new InstanceGet.byReference(kind, readExpression(), readName(),
         resultType: readDartType(),
-        interfaceTargetReference: readInstanceMemberReference())
+        interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2047,7 +2103,7 @@
     int offset = readOffset();
     return new InstanceTearOff.byReference(kind, readExpression(), readName(),
         resultType: readDartType(),
-        interfaceTargetReference: readInstanceMemberReference())
+        interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2061,7 +2117,7 @@
   Expression _readPropertySet() {
     int offset = readOffset();
     return new PropertySet.byReference(readExpression(), readName(),
-        readExpression(), readInstanceMemberReference(allowNull: true))
+        readExpression(), readNullableInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2070,7 +2126,7 @@
     int offset = readOffset();
     return new InstanceSet.byReference(
         kind, readExpression(), readName(), readExpression(),
-        interfaceTargetReference: readInstanceMemberReference())
+        interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
@@ -2085,33 +2141,34 @@
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
     return new SuperPropertyGet.byReference(
-        readName(), readInstanceMemberReference(allowNull: true))
+        readName(), readNullableInstanceMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readSuperPropertySet() {
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
-    return new SuperPropertySet.byReference(readName(), readExpression(),
-        readInstanceMemberReference(allowNull: true))
+    return new SuperPropertySet.byReference(
+        readName(), readExpression(), readNullableInstanceMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readStaticGet() {
     int offset = readOffset();
-    return new StaticGet.byReference(readMemberReference())
+    return new StaticGet.byReference(readNonNullMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readStaticTearOff() {
     int offset = readOffset();
-    return new StaticTearOff.byReference(readMemberReference())
+    return new StaticTearOff.byReference(readNonNullMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readStaticSet() {
     int offset = readOffset();
-    return new StaticSet.byReference(readMemberReference(), readExpression())
+    return new StaticSet.byReference(
+        readNonNullMemberReference(), readExpression())
       ..fileOffset = offset;
   }
 
@@ -2119,7 +2176,7 @@
     int flags = readByte();
     int offset = readOffset();
     return new MethodInvocation.byReference(readExpression(), readName(),
-        readArguments(), readInstanceMemberReference(allowNull: true))
+        readArguments(), readNullableInstanceMemberReference())
       ..fileOffset = offset
       ..flags = flags;
   }
@@ -2130,8 +2187,8 @@
     int offset = readOffset();
     return new InstanceInvocation.byReference(
         kind, readExpression(), readName(), readArguments(),
-        functionType: readDartType(),
-        interfaceTargetReference: readInstanceMemberReference())
+        functionType: readDartType() as FunctionType,
+        interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset
       ..flags = flags;
   }
@@ -2167,7 +2224,7 @@
     int offset = readOffset();
     readUInt30(); // offset of the variable declaration in the binary.
     return new LocalFunctionInvocation(readVariableReference(), readArguments(),
-        functionType: readDartType())
+        functionType: readDartType() as FunctionType)
       ..fileOffset = offset;
   }
 
@@ -2181,23 +2238,23 @@
     int offset = readOffset();
     return new EqualsCall.byReference(readExpression(), readExpression(),
         isNot: readByte() == 1,
-        functionType: readDartType(),
-        interfaceTargetReference: readInstanceMemberReference())
+        functionType: readDartType() as FunctionType,
+        interfaceTargetReference: readNonNullInstanceMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readSuperMethodInvocation() {
     int offset = readOffset();
     addTransformerFlag(TransformerFlag.superCalls);
-    return new SuperMethodInvocation.byReference(readName(), readArguments(),
-        readInstanceMemberReference(allowNull: true))
+    return new SuperMethodInvocation.byReference(
+        readName(), readArguments(), readNullableInstanceMemberReference())
       ..fileOffset = offset;
   }
 
   Expression _readStaticInvocation() {
     int offset = readOffset();
     return new StaticInvocation.byReference(
-        readMemberReference(), readArguments(),
+        readNonNullMemberReference(), readArguments(),
         isConst: false)
       ..fileOffset = offset;
   }
@@ -2205,7 +2262,7 @@
   Expression _readConstStaticInvocation() {
     int offset = readOffset();
     return new StaticInvocation.byReference(
-        readMemberReference(), readArguments(),
+        readNonNullMemberReference(), readArguments(),
         isConst: true)
       ..fileOffset = offset;
   }
@@ -2213,7 +2270,7 @@
   Expression _readConstructorInvocation() {
     int offset = readOffset();
     return new ConstructorInvocation.byReference(
-        readMemberReference(), readArguments(),
+        readNonNullMemberReference(), readArguments(),
         isConst: false)
       ..fileOffset = offset;
   }
@@ -2221,7 +2278,7 @@
   Expression _readConstConstructorInvocation() {
     int offset = readOffset();
     return new ConstructorInvocation.byReference(
-        readMemberReference(), readArguments(),
+        readNonNullMemberReference(), readArguments(),
         isConst: true)
       ..fileOffset = offset;
   }
@@ -2241,8 +2298,12 @@
   }
 
   Expression _readConditionalExpression() {
-    return new ConditionalExpression(readExpression(), readExpression(),
-        readExpression(), readDartTypeOption());
+    return new ConditionalExpression(
+        readExpression(),
+        readExpression(),
+        readExpression(),
+        // TODO(johnniwinther): Change this to use `readDartType`.
+        readDartTypeOption()!);
   }
 
   Expression _readStringConcatenation() {
@@ -2277,12 +2338,13 @@
 
   Expression _readInstanceCreation() {
     int offset = readOffset();
-    Reference classReference = readClassReference();
+    Reference classReference = readNonNullClassReference();
     List<DartType> typeArguments = readDartTypeList();
     int fieldValueCount = readUInt30();
     Map<Reference, Expression> fieldValues = <Reference, Expression>{};
     for (int i = 0; i < fieldValueCount; i++) {
-      final Reference fieldRef = readCanonicalNameReference().getReference();
+      final Reference fieldRef =
+          readNonNullCanonicalNameReference().getReference();
       final Expression value = readExpression();
       fieldValues[fieldRef] = value;
     }
@@ -2295,7 +2357,7 @@
       asserts = emptyListOfAssertStatement;
     } else {
       asserts = new List<AssertStatement>.generate(
-          assertCount, (_) => readStatement(),
+          assertCount, (_) => readStatement() as AssertStatement,
           growable: false);
     }
     List<Expression> unusedArguments = readExpressionList();
@@ -2305,7 +2367,7 @@
   }
 
   Expression _readFileUriExpression() {
-    Uri fileUri = readUriReference();
+    Uri fileUri = readUriReference()!;
     int offset = readOffset();
     return new FileUriExpression(readExpression(), fileUri)
       ..fileOffset = offset;
@@ -2503,7 +2565,7 @@
         growable: true);
   }
 
-  Statement readStatementOrNullIfEmpty() {
+  Statement? readStatementOrNullIfEmpty() {
     Statement node = readStatement();
     if (node is EmptyStatement) {
       return null;
@@ -2512,7 +2574,7 @@
     }
   }
 
-  Statement readStatementOption() {
+  Statement? readStatementOption() {
     return readAndCheckOptionTag() ? readStatement() : null;
   }
 
@@ -2611,7 +2673,7 @@
     int variableStackHeight = variableStack.length;
     int offset = readOffset();
     List<VariableDeclaration> variables = readAndPushVariableDeclarationList();
-    Expression condition = readExpressionOption();
+    Expression? condition = readExpressionOption();
     List<Expression> updates = readExpressionList();
     Statement body = readStatement();
     variableStack.length = variableStackHeight;
@@ -2737,8 +2799,8 @@
     int variableStackHeight = variableStack.length;
     int offset = readOffset();
     DartType guard = readDartType();
-    VariableDeclaration exception = readAndPushVariableDeclarationOption();
-    VariableDeclaration stackTrace = readAndPushVariableDeclarationOption();
+    VariableDeclaration? exception = readAndPushVariableDeclarationOption();
+    VariableDeclaration? stackTrace = readAndPushVariableDeclarationOption();
     Statement body = readStatement();
     variableStack.length = variableStackHeight;
     return new Catch(exception, body, guard: guard, stackTrace: stackTrace)
@@ -2764,16 +2826,16 @@
   }
 
   Supertype readSupertype() {
-    InterfaceType type = readDartType(forSupertype: true);
+    InterfaceType type = readDartType(forSupertype: true) as InterfaceType;
     assert(
-        type.nullability == _currentLibrary.nonNullable,
+        type.nullability == _currentLibrary!.nonNullable,
         "In serialized form supertypes should have Nullability.legacy if they "
         "are in a library that is opted out of the NNBD feature.  If they are "
         "in an opted-in library, they should have Nullability.nonNullable.");
     return new Supertype.byReference(type.className, type.typeArguments);
   }
 
-  Supertype readSupertypeOption() {
+  Supertype? readSupertypeOption() {
     return readAndCheckOptionTag() ? readSupertype() : null;
   }
 
@@ -2818,7 +2880,7 @@
         isRequired: (flags & NamedType.FlagRequiredNamedType) != 0);
   }
 
-  DartType readDartTypeOption() {
+  DartType? readDartTypeOption() {
     return readAndCheckOptionTag() ? readDartType() : null;
   }
 
@@ -2852,7 +2914,7 @@
 
   DartType _readTypedefType() {
     int nullabilityIndex = readByte();
-    return new TypedefType.byReference(readTypedefReference(),
+    return new TypedefType.byReference(readNonNullTypedefReference(),
         Nullability.values[nullabilityIndex], readDartTypeList());
   }
 
@@ -2875,14 +2937,14 @@
 
   DartType _readInterfaceType() {
     int nullabilityIndex = readByte();
-    Reference reference = readClassReference();
+    Reference reference = readNonNullClassReference();
     List<DartType> typeArguments = readDartTypeList();
-    CanonicalName canonicalName = reference.canonicalName;
-    if (canonicalName.name == "FutureOr" &&
-        canonicalName.parent != null &&
-        canonicalName.parent.name == "dart:async" &&
-        canonicalName.parent.parent != null &&
-        canonicalName.parent.parent.isRoot) {
+    CanonicalName? canonicalName = reference.canonicalName;
+    if (canonicalName != null &&
+        canonicalName.name == "FutureOr" &&
+        canonicalName.parent!.name == "dart:async" &&
+        canonicalName.parent!.parent != null &&
+        canonicalName.parent!.parent!.isRoot) {
       return new FutureOrType(
           typeArguments.single, Nullability.values[nullabilityIndex]);
     }
@@ -2892,13 +2954,13 @@
 
   DartType _readSimpleInterfaceType(bool forSupertype) {
     int nullabilityIndex = readByte();
-    Reference classReference = readClassReference();
-    CanonicalName canonicalName = classReference.canonicalName;
+    Reference classReference = readNonNullClassReference();
+    CanonicalName? canonicalName = classReference.canonicalName;
     if (canonicalName != null &&
         !forSupertype &&
         canonicalName.name == "Null" &&
-        canonicalName.parent?.name == "dart:core" &&
-        (canonicalName.parent?.parent?.isRoot ?? false)) {
+        canonicalName.parent!.name == "dart:core" &&
+        canonicalName.parent!.parent!.isRoot) {
       return const NullType();
     }
     return new InterfaceType.byReference(classReference,
@@ -2913,7 +2975,7 @@
     int totalParameterCount = readUInt30();
     List<DartType> positional = readDartTypeList();
     List<NamedType> named = readNamedTypeList();
-    DartType typedefType = readDartTypeOption();
+    TypedefType? typedefType = readDartTypeOption() as TypedefType?;
     assert(positional.length + named.length == totalParameterCount);
     DartType returnType = readDartType();
     typeParameterStack.length = typeParameterStackHeight;
@@ -2936,13 +2998,13 @@
   DartType _readTypeParameterType() {
     int declaredNullabilityIndex = readByte();
     int index = readUInt30();
-    DartType bound = readDartTypeOption();
+    DartType? bound = readDartTypeOption();
     return new TypeParameterType(typeParameterStack[index],
         Nullability.values[declaredNullabilityIndex], bound);
   }
 
   List<TypeParameter> readAndPushTypeParameterList(
-      [List<TypeParameter> list, TreeNode parent]) {
+      [List<TypeParameter>? list, TreeNode? parent]) {
     int length = readUInt30();
     if (length == 0) {
       if (list != null) return list;
@@ -3020,7 +3082,7 @@
         growable: useGrowableLists);
   }
 
-  VariableDeclaration readAndPushVariableDeclarationOption() {
+  VariableDeclaration? readAndPushVariableDeclarationOption() {
     return readAndCheckOptionTag() ? readAndPushVariableDeclaration() : null;
   }
 
@@ -3064,13 +3126,13 @@
 class BinaryBuilderWithMetadata extends BinaryBuilder implements BinarySource {
   /// List of metadata subsections that have corresponding [MetadataRepository]
   /// and are awaiting to be parsed and attached to nodes.
-  List<_MetadataSubsection> _subsections;
+  List<_MetadataSubsection>? _subsections;
 
   BinaryBuilderWithMetadata(List<int> bytes,
-      {String filename,
+      {String? filename,
       bool disableLazyReading = false,
       bool disableLazyClassReading = false,
-      bool alwaysCreateNewNamedNodes})
+      bool? alwaysCreateNewNamedNodes})
       : super(bytes,
             filename: filename,
             disableLazyReading: disableLazyReading,
@@ -3098,7 +3160,7 @@
       // UInt32 tag (fixed size StringReference)
       final String tag = _stringTable[readUint32()];
 
-      final MetadataRepository repository = component.metadata[tag];
+      final MetadataRepository<dynamic>? repository = component.metadata[tag];
       if (repository != null) {
         // Read nodeOffsetToMetadataOffset mapping.
         final Map<int, int> mapping = <int, int>{};
@@ -3110,8 +3172,8 @@
           mapping[nodeOffset] = metadataOffset;
         }
 
-        _subsections ??= <_MetadataSubsection>[];
-        _subsections.add(new _MetadataSubsection(repository, mapping));
+        (_subsections ??= <_MetadataSubsection>[])
+            .add(new _MetadataSubsection(repository, mapping));
       }
 
       // Start of the subsection and the end of the previous one.
@@ -3130,28 +3192,28 @@
   }
 
   @override
-  void enterScope({List<TypeParameter> typeParameters}) {
+  void enterScope({List<TypeParameter>? typeParameters}) {
     if (typeParameters != null) {
       typeParameterStack.addAll(typeParameters);
     }
   }
 
   @override
-  void leaveScope({List<TypeParameter> typeParameters}) {
+  void leaveScope({List<TypeParameter>? typeParameters}) {
     if (typeParameters != null) {
       typeParameterStack.length -= typeParameters.length;
     }
   }
 
   @override
-  Node _associateMetadata(Node node, int nodeOffset) {
+  T _associateMetadata<T extends Node>(T node, int nodeOffset) {
     if (_subsections == null) {
       return node;
     }
 
-    for (_MetadataSubsection subsection in _subsections) {
+    for (_MetadataSubsection subsection in _subsections!) {
       // First check if there is any metadata associated with this node.
-      final int metadataOffset = subsection.mapping[nodeOffset];
+      final int? metadataOffset = subsection.mapping[nodeOffset];
       if (metadataOffset != null) {
         subsection.repository.mapping[node] =
             _readMetadata(node, subsection.repository, metadataOffset);
@@ -3312,7 +3374,8 @@
   @override
   Supertype readSupertype() {
     final int nodeOffset = _byteOffset;
-    InterfaceType type = super.readDartType(forSupertype: true);
+    InterfaceType type =
+        super.readDartType(forSupertype: true) as InterfaceType;
     return _associateMetadata(
         new Supertype.byReference(type.className, type.typeArguments),
         nodeOffset);
@@ -3345,7 +3408,7 @@
 
 /// Merges two compilation modes or throws if they are not compatible.
 NonNullableByDefaultCompiledMode mergeCompilationModeOrThrow(
-    NonNullableByDefaultCompiledMode a, NonNullableByDefaultCompiledMode b) {
+    NonNullableByDefaultCompiledMode? a, NonNullableByDefaultCompiledMode b) {
   if (a == null || a == b) {
     return b;
   }
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index 9c8e0a6..bbc745e 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -24,6 +24,9 @@
         return mergeFunctionTypes(a, b, nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -146,6 +149,9 @@
         return mergeInterfaceTypes(a, b, nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -176,6 +182,9 @@
         return mergeFutureOrTypes(a, b, nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -193,6 +202,9 @@
     if (b is DynamicType) {
       return a;
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -204,6 +216,9 @@
         return NeverType.fromNullability(nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -212,17 +227,23 @@
     if (b is NullType) {
       return a;
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
   @override
-  DartType? visitInvalidType(InvalidType a, DartType b) => null;
+  DartType? visitInvalidType(InvalidType a, DartType b) => a;
 
   @override
   DartType? visitVoidType(VoidType a, DartType b) {
     if (b is VoidType) {
       return a;
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -240,6 +261,9 @@
         return mergeTypeParameterTypes(a, b, nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
@@ -274,6 +298,9 @@
         return mergeTypedefTypes(a, b, nullability);
       }
     }
+    if (b is InvalidType) {
+      return b;
+    }
     return null;
   }
 
diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart
index 632ccc3..e709c41 100644
--- a/pkg/kernel/lib/src/nnbd_top_merge.dart
+++ b/pkg/kernel/lib/src/nnbd_top_merge.dart
@@ -90,7 +90,7 @@
       // NNBD_TOP_MERGE(void, Object*) = Object?
       return coreTypes.objectNullableRawType;
     }
-    return null;
+    return super.visitVoidType(a, b);
   }
 
   @override
@@ -108,7 +108,7 @@
       // NNBD_TOP_MERGE(dynamic, Object*) = Object?
       return coreTypes.objectNullableRawType;
     }
-    return null;
+    return super.visitDynamicType(a, b);
   }
 
   @override
diff --git a/pkg/kernel/lib/testing/type_parser.dart b/pkg/kernel/lib/testing/type_parser.dart
index 5842eee..4b935b4e 100644
--- a/pkg/kernel/lib/testing/type_parser.dart
+++ b/pkg/kernel/lib/testing/type_parser.dart
@@ -356,6 +356,9 @@
         type = new ParsedInterfaceType(
             "void", <ParsedType>[], ParsedNullability.nullable);
         optionalAdvance("?");
+      } else if (optionalAdvance("invalid")) {
+        type = new ParsedInterfaceType(
+            "invalid", <ParsedType>[], ParsedNullability.nullable);
       } else {
         String name = parseName();
         List<ParsedType> arguments = <ParsedType>[];
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 937e783..2782dd1 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -13,6 +13,7 @@
         FunctionType,
         FutureOrType,
         InterfaceType,
+        InvalidType,
         Library,
         NamedType,
         NeverType,
@@ -277,6 +278,10 @@
       // Don't return a const object to ensure we test implementations that use
       // identical.
       return new NullType();
+    } else if (name == "invalid") {
+      // Don't return a const object to ensure we test implementations that use
+      // identical.
+      return new InvalidType();
     } else if (additionalTypes != null && additionalTypes.containsKey(name)) {
       return additionalTypes[name].call();
     }
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 844736d..f8ffce6 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -1407,9 +1407,8 @@
 
   visitInvalidExpression(InvalidExpression node) {
     writeWord('invalid-expression');
-    // ignore: unnecessary_null_comparison
     if (node.message != null) {
-      writeWord('"${escapeString(node.message)}"');
+      writeWord('"${escapeString(node.message!)}"');
     }
   }
 
@@ -2550,9 +2549,9 @@
     writeIndentation();
     writeConstantReference(node);
     writeSpaced('=');
-    // ignore: unnecessary_null_comparison
-    String text = node.libraryReference != null
-        ? '#${node.libraryReference.asLibrary.importUri}::${node.name}'
+    Reference? libraryReference = node.libraryReference;
+    String text = libraryReference != null
+        ? '#${libraryReference.asLibrary.importUri}::${node.name}'
         : '#${node.name}';
     endLine('${text}');
   }
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 6263d1f..ae54219 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -980,10 +980,11 @@
 ///       @override
 ///       Node visitNot(Not node) {
 ///         var operand = node.operand.accept(this); // Remember to visit.
-///         if (operand is LogicalExpression && operand.operator == '&&') {
+///         if (operand is LogicalExpression &&
+///             operand.operator == LogicalExpressionOperator.AND) {
 ///           return new LogicalExpression(
 ///             new Not(operand.left),
-///             '||',
+///             LogicalExpressionOperator.OR,
 ///             new Not(operand.right));
 ///         }
 ///         return node;
@@ -1109,10 +1110,11 @@
 ///       @override
 ///       Node visitNot(Not node) {
 ///         var operand = node.operand.accept(this); // Remember to visit.
-///         if (operand is LogicalExpression && operand.operator == '&&') {
+///         if (operand is LogicalExpression &&
+///             operand.operator == LogicalExpressionOperator.AND) {
 ///           return new LogicalExpression(
 ///             new Not(operand.left),
-///             '||',
+///             LogicalExpressionOperator.OR,
 ///             new Not(operand.right));
 ///         }
 ///         return node;
diff --git a/pkg/kernel/test/metadata_test.dart b/pkg/kernel/test/metadata_test.dart
index d1214b6..653bdaa 100644
--- a/pkg/kernel/test/metadata_test.dart
+++ b/pkg/kernel/test/metadata_test.dart
@@ -73,7 +73,7 @@
   Metadata readFromBinary(Node node, BinarySource source) {
     final string1 = utf8.decode(source.readByteList());
     final string2 = source.readStringReference();
-    final memberRef = source.readCanonicalNameReference()?.reference;
+    final memberRef = source.readNullableCanonicalNameReference()?.reference;
     final type = source.readDartType();
     expect(string1, equals(string2));
     return new Metadata(string2, memberRef, type);
diff --git a/pkg/kernel/test/nnbd_top_merge_test.dart b/pkg/kernel/test/nnbd_top_merge_test.dart
index 73d07d2..7fac29a 100644
--- a/pkg/kernel/test/nnbd_top_merge_test.dart
+++ b/pkg/kernel/test/nnbd_top_merge_test.dart
@@ -110,6 +110,17 @@
     '<E extends List<E>>(E) -> void',
     '<F extends List<F>>(F) -> void'
   ],
+  'invalid vs invalid': 'invalid',
+  'invalid vs Object': 'invalid',
+  'invalid vs Object?': 'invalid',
+  'Object vs invalid': 'invalid',
+  'Object? vs invalid': 'invalid',
+  'void vs invalid': 'invalid',
+  'dynamic vs invalid': 'invalid',
+  'Null vs invalid': 'invalid',
+  'Never vs invalid': 'invalid',
+  '() -> void vs invalid': 'invalid',
+  '<T>(T) -> void vs <T>(invalid) -> void': '<T>(invalid) -> void',
 };
 
 main() {
diff --git a/pkg/vm/lib/metadata/direct_call.dart b/pkg/vm/lib/metadata/direct_call.dart
index b7e8277..22a26fd 100644
--- a/pkg/vm/lib/metadata/direct_call.dart
+++ b/pkg/vm/lib/metadata/direct_call.dart
@@ -47,7 +47,8 @@
 
   @override
   DirectCallMetadata readFromBinary(Node node, BinarySource source) {
-    final targetReference = source.readCanonicalNameReference()?.getReference();
+    final targetReference =
+        source.readNullableCanonicalNameReference()?.getReference();
     if (targetReference == null) {
       throw 'DirectCallMetadata should have a non-null target';
     }
diff --git a/pkg/vm/lib/metadata/inferred_type.dart b/pkg/vm/lib/metadata/inferred_type.dart
index d6441df..5f0c9af 100644
--- a/pkg/vm/lib/metadata/inferred_type.dart
+++ b/pkg/vm/lib/metadata/inferred_type.dart
@@ -127,7 +127,7 @@
     // TODO(sjindel/tfa): Implement serialization of type arguments when can use
     // them for optimizations.
     final concreteClassReference =
-        source.readCanonicalNameReference()?.getReference();
+        source.readNullableCanonicalNameReference()?.getReference();
     final flags = source.readByte();
     final constantValue = (flags & InferredType.flagConstant) != 0
         ? source.readConstantReference()
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index fbc6871..bd9e7ad 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -6322,8 +6322,10 @@
         " HeapSize\n");
     GrowableArray<SerializationCluster*> clusters_by_size;
     for (intptr_t cid = 1; cid < num_cids_; cid++) {
-      SerializationCluster* cluster = clusters_by_cid_[cid];
-      if (cluster != NULL) {
+      if (auto const cluster = canonical_clusters_by_cid_[cid]) {
+        clusters_by_size.Add(cluster);
+      }
+      if (auto const cluster = clusters_by_cid_[cid]) {
         clusters_by_size.Add(cluster);
       }
     }
diff --git a/runtime/vm/lockers.cc b/runtime/vm/lockers.cc
index 30e6ef8..a39f0c6 100644
--- a/runtime/vm/lockers.cc
+++ b/runtime/vm/lockers.cc
@@ -56,8 +56,7 @@
   }
 }
 
-SafepointMonitorLocker::SafepointMonitorLocker(Monitor* monitor)
-    : monitor_(monitor) {
+void SafepointMonitorLocker::AcquireLock() {
   ASSERT(monitor_ != NULL);
   if (!monitor_->TryEnter()) {
     // We did not get the lock and could potentially block, so transition
@@ -72,6 +71,10 @@
   }
 }
 
+void SafepointMonitorLocker::ReleaseLock() {
+  monitor_->Exit();
+}
+
 Monitor::WaitResult SafepointMonitorLocker::Wait(int64_t millis) {
   Thread* thread = Thread::Current();
   if (thread != NULL) {
diff --git a/runtime/vm/lockers.h b/runtime/vm/lockers.h
index 7213808..b4557ae 100644
--- a/runtime/vm/lockers.h
+++ b/runtime/vm/lockers.h
@@ -259,19 +259,38 @@
  */
 class SafepointMonitorLocker : public ValueObject {
  public:
-  explicit SafepointMonitorLocker(Monitor* monitor);
-  virtual ~SafepointMonitorLocker() { monitor_->Exit(); }
+  explicit SafepointMonitorLocker(Monitor* monitor) : monitor_(monitor) {
+    AcquireLock();
+  }
+  virtual ~SafepointMonitorLocker() { ReleaseLock(); }
 
   Monitor::WaitResult Wait(int64_t millis = Monitor::kNoTimeout);
 
   void NotifyAll() { monitor_->NotifyAll(); }
 
  private:
+  friend class SafepointMonitorUnlockScope;
+
+  void AcquireLock();
+  void ReleaseLock();
+
   Monitor* const monitor_;
 
   DISALLOW_COPY_AND_ASSIGN(SafepointMonitorLocker);
 };
 
+class SafepointMonitorUnlockScope : public ValueObject {
+ public:
+  explicit SafepointMonitorUnlockScope(SafepointMonitorLocker* locker)
+      : locker_(locker) {
+    locker_->ReleaseLock();
+  }
+  ~SafepointMonitorUnlockScope() { locker_->AcquireLock(); }
+
+ private:
+  SafepointMonitorLocker* locker_;
+};
+
 class RwLock {
  public:
   RwLock() {}
diff --git a/runtime/vm/thread_test.cc b/runtime/vm/thread_test.cc
index 4303b5f..636aaa3 100644
--- a/runtime/vm/thread_test.cc
+++ b/runtime/vm/thread_test.cc
@@ -1102,4 +1102,23 @@
   EXPECT(state.elapsed_us > 2 * 500 * 1000);
 }
 
+ISOLATE_UNIT_TEST_CASE(SafepointMonitorUnlockScope) {
+  // This test uses ASSERT instead of EXPECT because IsOwnedByCurrentThread is
+  // only available in debug mode. Since our vm/cc tests run in DEBUG mode that
+  // is sufficent for this test.
+  Monitor monitor;
+  {
+    SafepointMonitorLocker ml(&monitor);
+    ASSERT(monitor.IsOwnedByCurrentThread());
+    {
+      SafepointMonitorUnlockScope ml_unlocker(&ml);
+      ASSERT(!monitor.IsOwnedByCurrentThread());
+      {
+        SafepointMonitorLocker inner_ml(&monitor);
+        ASSERT(monitor.IsOwnedByCurrentThread());
+      }
+    }
+  }
+}
+
 }  // namespace dart
diff --git a/tools/VERSION b/tools/VERSION
index 91462d4..a23974c 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 13
 PATCH 0
-PRERELEASE 93
+PRERELEASE 94
 PRERELEASE_PATCH 0
\ No newline at end of file
