[cfe,ddc,dart2js,vm] Add NullType

This CL is the sum of the following 5 CLs:
* https://dart-review.googlesource.com/c/sdk/+/170342/
* https://dart-review.googlesource.com/c/sdk/+/170344/
* https://dart-review.googlesource.com/c/sdk/+/170345/
* https://dart-review.googlesource.com/c/sdk/+/170346/
* https://dart-review.googlesource.com/c/sdk/+/170347/

The reason for landing the 5 CLs as one CL is to prevent potential
troubles with bisecting over the branch because the change is fully
functional only with all 5 CLs.

Closes #40122.

TEST=Verified by changes in .expect files in pkg/vm/.
Bug: https://github.com/dart-lang/sdk/issues/40122
Change-Id: Ib8197802fdc69694387ae47ac990c58b3aaab7a5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170689
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/ir/scope_visitor.dart b/pkg/compiler/lib/src/ir/scope_visitor.dart
index 74ac0b9..7806fae 100644
--- a/pkg/compiler/lib/src/ir/scope_visitor.dart
+++ b/pkg/compiler/lib/src/ir/scope_visitor.dart
@@ -701,6 +701,10 @@
       const EvaluationComplexity.lazy();
 
   @override
+  EvaluationComplexity visitNullType(ir.NullType node) =>
+      const EvaluationComplexity.lazy();
+
+  @override
   EvaluationComplexity visitInvalidType(ir.InvalidType node) =>
       const EvaluationComplexity.lazy();
 
diff --git a/pkg/compiler/lib/src/ir/static_type.dart b/pkg/compiler/lib/src/ir/static_type.dart
index 13b7967..2b6981c 100644
--- a/pkg/compiler/lib/src/ir/static_type.dart
+++ b/pkg/compiler/lib/src/ir/static_type.dart
@@ -195,7 +195,12 @@
     while (type is ir.TypeParameterType) {
       type = (type as ir.TypeParameterType).parameter.bound;
     }
-    return type is ir.InterfaceType ? type : null;
+    if (type is ir.InterfaceType) {
+      return type;
+    } else if (type is ir.NullType) {
+      return typeEnvironment.coreTypes.deprecatedNullType;
+    }
+    return null;
   }
 
   /// Returns the static type of the expression as an instantiation of
@@ -222,7 +227,7 @@
     while (type is ir.TypeParameterType) {
       type = (type as ir.TypeParameterType).parameter.bound;
     }
-    if (type == typeEnvironment.nullType) {
+    if (type is ir.NullType) {
       return typeEnvironment.coreTypes
           .bottomInterfaceType(superclass, currentLibrary.nullable);
     }
@@ -711,7 +716,7 @@
     ir.DartType promotedType = typeMap.typeOf(node, typeEnvironment);
     assert(
         node.promotedType == null ||
-            promotedType == typeEnvironment.nullType ||
+            promotedType is ir.NullType ||
             promotedType is ir.FutureOrType ||
             typeEnvironment.isSubtypeOf(promotedType, node.promotedType,
                 ir.SubtypeCheckMode.ignoringNullabilities),
@@ -1003,7 +1008,7 @@
   ir.DartType visitNullCheck(ir.NullCheck node) {
     ir.DartType operandType = visitNode(node.operand);
     handleNullCheck(node, operandType);
-    ir.DartType resultType = operandType == typeEnvironment.nullType
+    ir.DartType resultType = operandType is ir.NullType
         ? const ir.NeverType(ir.Nullability.nonNullable)
         : operandType.withDeclaredNullability(ir.Nullability.nonNullable);
     _staticTypeCache._expressionTypes[node] = resultType;
@@ -1502,13 +1507,13 @@
       for (ir.DartType type in falseTypes) {
         if (typeEnvironment.isSubtypeOf(
             declaredType, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
-          return typeEnvironment.nullType;
+          return const ir.NullType();
         }
       }
     }
     if (trueTypes != null) {
       for (ir.DartType type in trueTypes) {
-        if (type == typeEnvironment.nullType) {
+        if (type is ir.NullType) {
           return type;
         }
         if (typeEnvironment.isSubtypeOf(
@@ -1770,9 +1775,9 @@
       if (candidate == null) {
         candidate = type;
       } else {
-        if (type == typeEnvironment.nullType) {
+        if (type is ir.NullType) {
           // Keep the current candidate.
-        } else if (candidate == typeEnvironment.nullType) {
+        } else if (candidate is ir.NullType) {
           candidate = type;
         } else if (typeEnvironment.isSubtypeOf(
             candidate, type, ir.SubtypeCheckMode.ignoringNullabilities)) {
diff --git a/pkg/compiler/lib/src/ir/static_type_base.dart b/pkg/compiler/lib/src/ir/static_type_base.dart
index a19523e..246ed21 100644
--- a/pkg/compiler/lib/src/ir/static_type_base.dart
+++ b/pkg/compiler/lib/src/ir/static_type_base.dart
@@ -121,7 +121,7 @@
   }
 
   @override
-  ir.DartType visitNullLiteral(ir.NullLiteral node) => typeEnvironment.nullType;
+  ir.DartType visitNullLiteral(ir.NullLiteral node) => const ir.NullType();
 
   @override
   ir.DartType visitIntLiteral(ir.IntLiteral node) =>
diff --git a/pkg/compiler/lib/src/ir/util.dart b/pkg/compiler/lib/src/ir/util.dart
index 437a842..fc79ee4 100644
--- a/pkg/compiler/lib/src/ir/util.dart
+++ b/pkg/compiler/lib/src/ir/util.dart
@@ -222,6 +222,9 @@
   bool visitNeverType(ir.NeverType node) => false;
 
   @override
+  bool visitNullType(ir.NullType node) => false;
+
+  @override
   bool visitVoidType(ir.VoidType node) => false;
 
   @override
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index e4a2425..d375fed 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -181,6 +181,11 @@
   DartType visitNeverType(ir.NeverType node) {
     return _convertNullability(_dartTypes.neverType(), node.nullability);
   }
+
+  @override
+  DartType visitNullType(ir.NullType node) {
+    return elementMap.commonElements.nullType;
+  }
 }
 
 class ConstantValuefier extends ir.ComputeOnceConstantVisitor<ConstantValue> {
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index ad10c22..d167042 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -141,6 +141,12 @@
     if (receiverType is ir.InterfaceType) {
       return new StrongModeConstraint(commonElements, _nativeBasicData,
           elementMap.getClass(receiverType.classNode), relation);
+    } else if (receiverType is ir.NullType) {
+      return new StrongModeConstraint(
+          commonElements,
+          _nativeBasicData,
+          elementMap.getClass(typeEnvironment.coreTypes.deprecatedNullClass),
+          relation);
     }
     return null;
   }
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index 26f9bc1..b3ad306 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -276,6 +276,8 @@
         ir.Nullability nullability = readEnum(ir.Nullability.values);
         ir.DartType typeArgument = _readDartTypeNode(functionTypeVariables);
         return new ir.FutureOrType(typeArgument, nullability);
+      case DartTypeNodeKind.nullType:
+        return const ir.NullType();
     }
     throw new UnsupportedError("Unexpected DartTypeKind $kind");
   }
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index b2c6d10..25162f0 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -120,6 +120,7 @@
   doesNotComplete,
   neverType,
   futureOrType,
+  nullType,
 }
 
 const String functionTypeNodeTag = 'function-type-node';
@@ -181,6 +182,12 @@
   }
 
   @override
+  void visitNullType(
+      ir.NullType node, List<ir.TypeParameter> functionTypeVariables) {
+    _sink.writeEnum(DartTypeNodeKind.nullType);
+  }
+
+  @override
   void visitInterfaceType(
       ir.InterfaceType node, List<ir.TypeParameter> functionTypeVariables) {
     if (node is ThisInterfaceType) {
diff --git a/pkg/compiler/test/analyses/analysis_helper.dart b/pkg/compiler/test/analyses/analysis_helper.dart
index 3261133..06e356a 100644
--- a/pkg/compiler/test/analyses/analysis_helper.dart
+++ b/pkg/compiler/test/analyses/analysis_helper.dart
@@ -311,7 +311,7 @@
     ir.DartType staticType = node?.accept(this);
     assert(
         node is! ir.Expression ||
-            staticType == typeEnvironment.nullType ||
+            staticType is ir.NullType ||
             staticType is ir.FutureOrType ||
             typeEnvironment.isSubtypeOf(
                 staticType,
diff --git a/pkg/compiler/test/helpers/ir_types.dart b/pkg/compiler/test/helpers/ir_types.dart
index e5cbaa3..65a87a4 100644
--- a/pkg/compiler/test/helpers/ir_types.dart
+++ b/pkg/compiler/test/helpers/ir_types.dart
@@ -119,6 +119,11 @@
   }
 
   @override
+  void visitNullType(ir.NullType node, StringBuffer sb) {
+    sb.write('Null');
+  }
+
+  @override
   void visitVoidType(ir.VoidType node, StringBuffer sb) {
     sb.write('void');
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 8a5f5b2..16cd2fe 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -1070,7 +1070,7 @@
             c == _coreTypes.stringClass ||
             c == _coreTypes.functionClass ||
             c == _coreTypes.intClass ||
-            c == _coreTypes.nullClass ||
+            c == _coreTypes.deprecatedNullClass ||
             c == _coreTypes.numClass ||
             c == _coreTypes.doubleClass ||
             c == _coreTypes.boolClass)) {
@@ -2567,12 +2567,16 @@
 
   @override
   js_ast.Expression visitBottomType(BottomType type) =>
-      _emitType(_types.nullType);
+      _emitType(const NullType());
+
+  @override
+  js_ast.Expression visitNullType(NullType type) =>
+      _emitInterfaceType(_coreTypes.deprecatedNullType);
 
   @override
   js_ast.Expression visitNeverType(NeverType type) =>
       type.nullability == Nullability.nullable
-          ? visitInterfaceType(_coreTypes.nullType)
+          ? visitNullType(const NullType())
           : _emitNullabilityWrapper(runtimeCall('Never'), type.nullability);
 
   /// Normalizes `FutureOr` types and emits the normalized version.
@@ -2605,8 +2609,7 @@
       // FutureOr<Never> --> Future<Never>
       return _emitInterfaceType(InterfaceType(
           _coreTypes.futureClass, futureOr.nullability, [typeArgument]));
-    } else if (typeArgument is InterfaceType &&
-        typeArgument.classNode == _coreTypes.nullClass) {
+    } else if (typeArgument is NullType) {
       // FutureOr<Null> --> Future<Null>?
       return _emitInterfaceType(InterfaceType(
           _coreTypes.futureClass, Nullability.nullable, [typeArgument]));
@@ -2690,7 +2693,7 @@
     // * The types were written in JS context or as part of the dart:_runtime
     //   library.
     if (!emitNullability ||
-        type == _coreTypes.nullType ||
+        type == _coreTypes.deprecatedNullType ||
         // TODO(38701) Remove these once the SDK has unforked and is running
         // "opted-in"
         !coreLibrary.isNonNullableByDefault &&
@@ -5134,8 +5137,7 @@
           importUri.path == 'html_common');
 
   bool _isNull(Expression expr) =>
-      expr is NullLiteral ||
-      expr.getStaticType(_staticTypeContext) == _coreTypes.nullType;
+      expr is NullLiteral || expr.getStaticType(_staticTypeContext) is NullType;
 
   bool _doubleEqIsIdentity(Expression left, Expression right) {
     // If we statically know LHS or RHS is null we can use ==.
diff --git a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
index 6206452..272b682 100644
--- a/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
+++ b/pkg/dev_compiler/lib/src/kernel/js_typerep.dart
@@ -39,10 +39,10 @@
 
     // Note that this should be changed if Dart gets non-nullable types
     if (type == const BottomType()) return JSType.jsNull;
+    if (type == const NullType()) return JSType.jsNull;
 
     if (type is InterfaceType) {
       var c = type.classNode;
-      if (c == coreTypes.nullClass) return JSType.jsNull;
       if (c == coreTypes.numClass ||
           c == coreTypes.intClass ||
           c == coreTypes.doubleClass ||
diff --git a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
index eb1c8b1..437fcce 100644
--- a/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
+++ b/pkg/dev_compiler/lib/src/kernel/kernel_helpers.dart
@@ -336,6 +336,7 @@
       t is InterfaceType ||
       t is InvalidType ||
       t is NeverType ||
+      t is NullType ||
       t is TypeParameterType ||
       t is TypedefType ||
       t is VoidType;
diff --git a/pkg/dev_compiler/lib/src/kernel/type_table.dart b/pkg/dev_compiler/lib/src/kernel/type_table.dart
index 179a59b..ddaf27f 100644
--- a/pkg/dev_compiler/lib/src/kernel/type_table.dart
+++ b/pkg/dev_compiler/lib/src/kernel/type_table.dart
@@ -119,6 +119,7 @@
     if (type is VoidType) return 'void';
     if (type is NeverType) return 'Never$nullability';
     if (type is BottomType) return 'bottom';
+    if (type is NullType) return 'Null';
     return 'invalid';
   }
 
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 9326ea29..9753c50 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -52,7 +52,7 @@
     });
     test('Map', () async {
       await expectNotNull('main() { print({"x": null}); }',
-          '<dart.core::String*, dart.core::Null?>{"x": null}, "x"');
+          '<dart.core::String*, Null>{"x": null}, "x"');
     });
 
     test('Symbol', () async {
@@ -258,7 +258,7 @@
 
   test('function expression', () async {
     await expectNotNull(
-        'main() { () => null; f() {}; f; }', 'dart.core::Null? () => null, f');
+        'main() { () => null; f() {}; f; }', 'Null () => null, f');
   });
 
   test('cascades (kernel BlockExpression)', () async {
@@ -399,7 +399,7 @@
       await expectNotNull('''main() {
         var x = () => 42;
         var y = (() => x = null);
-      }''', 'dart.core::int* () => 42, 42, dart.core::Null? () => x = null');
+      }''', 'dart.core::int* () => 42, 42, Null () => x = null');
     });
     test('do not depend on unrelated variables', () async {
       await expectNotNull('''main() {
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 6f675d8..6b97dd9 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -16,6 +16,7 @@
         InterfaceType,
         Member,
         Name,
+        NullType,
         Nullability,
         Supertype,
         TypeParameter,
@@ -538,7 +539,7 @@
       Nullability nullability, List<DartType> arguments) {
     assert(arguments == null || cls.typeParameters.length == arguments.length);
     if (isNullClass) {
-      nullability = Nullability.nullable;
+      return const NullType();
     }
     if (name == "FutureOr") {
       LibraryBuilder parentLibrary = parent;
@@ -781,7 +782,7 @@
       InterfaceType requiredInterface =
           substitution.substituteSupertype(constraint).asInterfaceType;
       InterfaceType implementedInterface = hierarchy.getTypeAsInstanceOf(
-          supertype, requiredInterface.classNode, library.library, coreTypes);
+          supertype, requiredInterface.classNode, library.library);
       if (implementedInterface == null ||
           !typeEnvironment.areMutualSubtypes(
               implementedInterface,
diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
index 224ecbc..7f80ef3e 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -157,6 +157,8 @@
 
   void addSyntheticDeclarationOfNever();
 
+  void addSyntheticDeclarationOfNull();
+
   /// Lookups the member [name] declared in this library.
   ///
   /// If [required] is `true` and no member is found an internal problem is
@@ -387,6 +389,9 @@
     if (scope.lookupLocalMember("Never", setter: false) == null) {
       addSyntheticDeclarationOfNever();
     }
+    if (scope.lookupLocalMember("Null", setter: false) == null) {
+      addSyntheticDeclarationOfNull();
+    }
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index dec0428..e09e091 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -6,17 +6,7 @@
 
 import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
 
-import 'package:kernel/ast.dart'
-    show
-        Class,
-        DartType,
-        Extension,
-        InterfaceType,
-        InvalidType,
-        Supertype,
-        TreeNode,
-        TypeParameter,
-        TypedefType;
+import 'package:kernel/ast.dart' hide MapEntry;
 
 import '../fasta_codes.dart'
     show
@@ -262,7 +252,6 @@
       TypeVariableBuilder typeParameterBuilder = declaration;
       TypeParameter typeParameter = typeParameterBuilder.parameter;
       if (typeParameter.parent is Class || typeParameter.parent is Extension) {
-        messageTypeVariableInStaticContext;
         library.addProblem(
             messageTypeVariableInStaticContext,
             charOffset ?? TreeNode.noOffset,
@@ -295,6 +284,50 @@
           declaration.buildType(library, library.nonNullableBuilder, arguments);
       if (type is InterfaceType) {
         return new Supertype(type.classNode, type.typeArguments);
+      } else if (type is NullType) {
+        // Even though Null is disallowed as a supertype, ClassHierarchyBuilder
+        // still expects it to be built to the respective InterfaceType
+        // referencing the deprecated class.
+        // TODO(dmitryas): Remove the dependency on the deprecated Null class
+        // from ClassHierarchyBuilder.
+        TypeDeclarationBuilder unaliasedDeclaration = this.declaration;
+        // The following code assumes that the declaration is a TypeAliasBuilder
+        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // length is 0) references a ClassBuilder of the Null class.  Otherwise,
+        // it won't produce the NullType on the output.
+        while (unaliasedDeclaration is TypeAliasBuilder) {
+          unaliasedDeclaration =
+              (unaliasedDeclaration as TypeAliasBuilder).type.declaration;
+          assert(unaliasedDeclaration != null);
+        }
+        assert(unaliasedDeclaration is ClassBuilder &&
+            unaliasedDeclaration.name == "Null");
+        return new Supertype(
+            (unaliasedDeclaration as ClassBuilder).cls, const <DartType>[]);
+      } else if (type is FutureOrType) {
+        // Even though FutureOr is disallowed as a supertype,
+        // ClassHierarchyBuilder still expects it to be built to the respective
+        // InterfaceType referencing the deprecated class.  In contrast with
+        // Null, it doesn't surface as an error due to FutureOr class not having
+        // any inheritable members.
+        // TODO(dmitryas): Remove the dependency on the deprecated FutureOr
+        // class from ClassHierarchyBuilder.
+        TypeDeclarationBuilder unaliasedDeclaration = this.declaration;
+        // The following code assumes that the declaration is a TypeAliasBuilder
+        // that through a chain of other TypeAliasBuilders (possibly, the chian
+        // length is 0) references a ClassBuilder of the FutureOr class.
+        // Otherwise, it won't produce the FutureOrType on the output.
+        while (unaliasedDeclaration is TypeAliasBuilder) {
+          unaliasedDeclaration =
+              (unaliasedDeclaration as TypeAliasBuilder).type.declaration;
+          assert(unaliasedDeclaration != null);
+        }
+        assert(unaliasedDeclaration is ClassBuilder &&
+            unaliasedDeclaration.name == "FutureOr");
+        return new Supertype((unaliasedDeclaration as ClassBuilder).cls,
+            <DartType>[type.typeArgument]);
+      } else {
+        // Do nothing: handleInvalidSuper below will handle the erroneous case.
       }
     } else if (declaration is InvalidTypeDeclarationBuilder) {
       library.addProblem(
diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
index f8700b1..509dd32 100644
--- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart
@@ -4,17 +4,15 @@
 
 library fasta.never_type_builder;
 
-import 'package:kernel/ast.dart' show DartType, InterfaceType, Nullability;
+import 'package:kernel/ast.dart' show DartType, NullType, Nullability;
 
 import 'builtin_type_declaration_builder.dart';
-import 'class_builder.dart';
 import 'library_builder.dart';
 import 'nullability_builder.dart';
 import 'type_builder.dart';
 
 class NeverTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
   final LibraryBuilder coreLibrary;
-  DartType _nullType;
 
   NeverTypeDeclarationBuilder(DartType type, this.coreLibrary, int charOffset)
       : super("Never", type, coreLibrary, charOffset) {
@@ -23,19 +21,11 @@
 
   String get debugName => "NeverTypeDeclarationBuilder";
 
-  DartType get nullType {
-    if (_nullType == null) {
-      ClassBuilder nullClass = coreLibrary.lookupLocalMember('Null');
-      _nullType = new InterfaceType(nullClass.cls, Nullability.nullable, []);
-    }
-    return _nullType;
-  }
-
   DartType buildType(LibraryBuilder library,
       NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
       [bool notInstanceContext]) {
     if (!library.isNonNullableByDefault) {
-      return nullType;
+      return const NullType();
     }
     return type.withDeclaredNullability(nullabilityBuilder.build(library));
   }
@@ -43,7 +33,7 @@
   DartType buildTypesWithBuiltArguments(LibraryBuilder library,
       Nullability nullability, List<DartType> arguments) {
     if (!library.isNonNullableByDefault) {
-      return nullType;
+      return const NullType();
     }
     return type.withDeclaredNullability(nullability);
   }
diff --git a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
new file mode 100644
index 0000000..cbfd853
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, 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.
+
+library fasta.null_type_declaration_builder;
+
+import 'package:kernel/ast.dart' show DartType, Nullability;
+
+import 'builtin_type_declaration_builder.dart';
+import 'library_builder.dart';
+import 'nullability_builder.dart';
+import 'type_builder.dart';
+
+class NullTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder {
+  NullTypeDeclarationBuilder(
+      DartType type, LibraryBuilder compilationUnit, int charOffset)
+      : super("Null", type, compilationUnit, charOffset);
+
+  String get debugName => "NullTypeBuilder";
+
+  DartType buildType(LibraryBuilder library,
+      NullabilityBuilder nullabilityBuilder, List<TypeBuilder> arguments,
+      [bool notInstanceContext]) {
+    return type;
+  }
+
+  DartType buildTypesWithBuiltArguments(LibraryBuilder library,
+      Nullability nullability, List<DartType> arguments) {
+    return type;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index fd2a831..08d1655 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -164,6 +164,10 @@
         -1);
   }
 
+  void addSyntheticDeclarationOfNull() {
+    // The name "Null" is declared by the class Null.
+  }
+
   void addClass(Class cls) {
     DillClassBuilder classBulder = new DillClassBuilder(cls, this);
     addBuilder(cls.name, classBulder, cls.fileOffset);
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index 2bbe28c..9cf8bad 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -4,8 +4,7 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart'
-    show DartType, InterfaceType, InvalidType, Typedef;
+import 'package:kernel/ast.dart' show DartType, InvalidType, NullType, Typedef;
 
 import '../builder/library_builder.dart';
 import '../builder/metadata_builder.dart';
@@ -90,14 +89,5 @@
   }
 
   @override
-  bool get isNullAlias {
-    DartType dartType = typedef.type;
-    if (dartType is InterfaceType) {
-      Uri importUri = dartType.classNode.enclosingLibrary.importUri;
-      return dartType.classNode.name == "Null" &&
-          importUri.scheme == "dart" &&
-          importUri.path == "core";
-    }
-    return false;
-  }
+  bool get isNullAlias => typedef.type is NullType;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
index ec6d37e..5c5223c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -352,8 +352,6 @@
 
   final Class functionClass;
 
-  final Class nullClass;
-
   final List<DelayedTypeComputation> _delayedTypeComputations =
       <DelayedTypeComputation>[];
 
@@ -368,8 +366,7 @@
   ClassHierarchyBuilder(this.objectClassBuilder, this.loader, this.coreTypes)
       : objectClass = objectClassBuilder.cls,
         futureClass = coreTypes.futureClass,
-        functionClass = coreTypes.functionClass,
-        nullClass = coreTypes.nullClass {
+        functionClass = coreTypes.functionClass {
     types = new Types(this);
   }
 
@@ -500,23 +497,9 @@
     return null;
   }
 
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes) {
-    Class kernelClass = type.classNode;
-    if (kernelClass == superclass) return type;
-    if (kernelClass == nullClass) {
-      if (superclass.typeParameters.isEmpty) {
-        return coreTypes.rawType(superclass, clientLibrary.nullable);
-      } else {
-        // This is a safe fall-back for dealing with `Null`. It will likely be
-        // faster to check for `Null` before calling this method.
-        return new InterfaceType(
-            superclass,
-            clientLibrary.nullable,
-            new List<DartType>.filled(
-                superclass.typeParameters.length, coreTypes.nullType));
-      }
-    }
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary) {
+    if (type.classNode == superclass) return type;
     return asSupertypeOf(type, superclass)
         .asInterfaceType
         .withDeclaredNullability(type.nullability);
@@ -524,13 +507,7 @@
 
   List<DartType> getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass) {
-    Class kernelClass = type.classNode;
-    if (kernelClass == superclass) return type.typeArguments;
-    if (kernelClass == nullClass) {
-      if (superclass.typeParameters.isEmpty) return const <DartType>[];
-      return new List<DartType>.filled(
-          superclass.typeParameters.length, coreTypes.nullType);
-    }
+    if (type.classNode == superclass) return type.typeArguments;
     return asSupertypeOf(type, superclass)?.typeArguments;
   }
 
@@ -544,10 +521,10 @@
     // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-out libraries the
     // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
     if (!clientLibrary.isNonNullableByDefault) {
-      if (type1 is InterfaceType && type1.classNode == nullClass) {
+      if (type1 is NullType) {
         return type2;
       }
-      if (type2 is InterfaceType && type2.classNode == nullClass) {
+      if (type2 is NullType) {
         return type1;
       }
     }
@@ -566,10 +543,10 @@
         continue;
       }
       if (nodes1.contains(node)) {
-        DartType candidate1 = getTypeAsInstanceOf(
-            type1, node.classBuilder.cls, clientLibrary, coreTypes);
-        DartType candidate2 = getTypeAsInstanceOf(
-            type2, node.classBuilder.cls, clientLibrary, coreTypes);
+        DartType candidate1 =
+            getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary);
+        DartType candidate2 =
+            getTypeAsInstanceOf(type2, node.classBuilder.cls, clientLibrary);
         if (candidate1 == candidate2) {
           common.add(node);
         }
@@ -585,8 +562,7 @@
     for (int i = 0; i < common.length - 1; i++) {
       ClassHierarchyNode node = common[i];
       if (node.maxInheritancePath != common[i + 1].maxInheritancePath) {
-        return getTypeAsInstanceOf(
-                type1, node.classBuilder.cls, clientLibrary, coreTypes)
+        return getTypeAsInstanceOf(type1, node.classBuilder.cls, clientLibrary)
             .withDeclaredNullability(
                 uniteNullabilities(type1.nullability, type2.nullability));
       } else {
@@ -2776,8 +2752,7 @@
   @override
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   @override
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 5bc4ffe..ea003a5 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
@@ -639,10 +639,7 @@
       return type;
     }
     InterfaceType instance = hierarchy.getTypeAsInstanceOf(
-        thisType,
-        member.enclosingClass,
-        classBuilder.library.library,
-        hierarchy.coreTypes);
+        thisType, member.enclosingClass, classBuilder.library.library);
     assert(
         instance != null,
         "No instance of $thisType as ${member.enclosingClass} found for "
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
index 4521aec..8f0a84bb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_collection_builders.dart
@@ -183,8 +183,8 @@
           mapEntries[i] =
               new ConstantMapEntry(entries[i], evaluator.nullConstant);
         }
-        Constant map = evaluator.lowerMapConstant(new MapConstant(
-            elementType, evaluator.typeEnvironment.nullType, mapEntries));
+        Constant map = evaluator.lowerMapConstant(
+            new MapConstant(elementType, const NullType(), mapEntries));
         return evaluator.lower(
             result,
             new InstanceConstant(
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 1d098cd..58a0b19 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -824,7 +824,6 @@
       coreTypes.internalSymbolClass: true,
       coreTypes.listClass: true,
       coreTypes.mapClass: true,
-      coreTypes.nullClass: true,
       coreTypes.objectClass: true,
       coreTypes.setClass: true,
       coreTypes.stringClass: true,
@@ -2426,13 +2425,13 @@
         if (constant is NullConstant) {
           if (type.nullability == Nullability.legacy) {
             // `null is Null` is handled below.
-            return typeEnvironment.isSubtypeOf(type, typeEnvironment.nullType,
+            return typeEnvironment.isSubtypeOf(type, const NullType(),
                     SubtypeCheckMode.ignoringNullabilities) ||
                 typeEnvironment.isSubtypeOf(typeEnvironment.objectLegacyRawType,
                     type, SubtypeCheckMode.ignoringNullabilities);
           } else {
-            return typeEnvironment.isSubtypeOf(typeEnvironment.nullType, type,
-                SubtypeCheckMode.withNullabilities);
+            return typeEnvironment.isSubtypeOf(
+                const NullType(), type, SubtypeCheckMode.withNullabilities);
           }
         }
         return isSubtype(
@@ -3118,6 +3117,9 @@
   bool visitBottomType(BottomType node) => true;
 
   @override
+  bool visitNullType(NullType node) => true;
+
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return _availableVariables.contains(node.parameter);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 58d2b99..2d14e54 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -1330,7 +1330,7 @@
       if (inferrer.isNonNullableByDefault) {
         return isNullAware ? const NeverType(Nullability.nonNullable) : null;
       } else {
-        return isNullAware ? inferrer.coreTypes.nullType : null;
+        return isNullAware ? const NullType() : null;
       }
     }
     if (spreadTypeBound is InterfaceType) {
@@ -1389,7 +1389,7 @@
             if (inferrer.isNonNullableByDefault &&
                 spreadType.isPotentiallyNullable &&
                 spreadType is! DynamicType &&
-                spreadType != inferrer.coreTypes.nullType &&
+                spreadType is! NullType &&
                 !element.isNullAware) {
               replacement = inferrer.helper.buildProblem(
                   messageNullableSpreadError, element.expression.fileOffset, 1);
@@ -1452,7 +1452,7 @@
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
               spreadType is! DynamicType &&
-              spreadType != inferrer.coreTypes.nullType &&
+              spreadType is! NullType &&
               !element.isNullAware) {
             replacement = inferrer.helper.buildProblem(
                 messageNullableSpreadError, element.expression.fileOffset, 1);
@@ -1800,7 +1800,7 @@
           output[offset] =
               output[offset + 1] = const NeverType(Nullability.nonNullable);
         } else {
-          output[offset] = output[offset + 1] = inferrer.coreTypes.nullType;
+          output[offset] = output[offset + 1] = const NullType();
         }
       }
     } else if (typeBound is InterfaceType) {
@@ -1874,7 +1874,7 @@
             if (inferrer.isNonNullableByDefault &&
                 spreadType.isPotentiallyNullable &&
                 spreadType is! DynamicType &&
-                spreadType != inferrer.coreTypes.nullType &&
+                spreadType is! NullType &&
                 !entry.isNullAware) {
               replacement = new SpreadMapEntry(
                   inferrer.helper.buildProblem(messageNullableSpreadError,
@@ -1993,7 +1993,7 @@
           if (inferrer.isNonNullableByDefault &&
               spreadType.isPotentiallyNullable &&
               spreadType is! DynamicType &&
-              spreadType != inferrer.coreTypes.nullType &&
+              spreadType is! NullType &&
               !entry.isNullAware) {
             keyError = inferrer.helper.buildProblem(
                 messageNullableSpreadError, entry.expression.fileOffset, 1);
@@ -5002,7 +5002,7 @@
   ExpressionInferenceResult visitNullLiteral(
       NullLiteral node, DartType typeContext) {
     inferrer.flowAnalysis.nullLiteral(node);
-    return new ExpressionInferenceResult(inferrer.coreTypes.nullType, node);
+    return new ExpressionInferenceResult(const NullType(), node);
   }
 
   @override
@@ -5247,7 +5247,7 @@
       node.expression = expressionResult.expression..parent = node;
       inferredType = expressionResult.inferredType;
     } else {
-      inferredType = inferrer.coreTypes.nullType;
+      inferredType = const NullType();
     }
     closureContext.handleReturn(inferrer, node, inferredType, node.isArrow);
     inferrer.flowAnalysis.handleExit();
@@ -5483,8 +5483,7 @@
     DartType receiverType = inferrer.classHierarchy.getTypeAsInstanceOf(
         inferrer.thisType,
         inferrer.thisType.classNode.supertype.classNode,
-        inferrer.library.library,
-        inferrer.coreTypes);
+        inferrer.library.library);
 
     ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
         receiverType, node.name, node.fileOffset,
diff --git a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
index d6bbd9a..fd05fdb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/invalid_type.dart
@@ -57,6 +57,9 @@
       false;
 
   @override
+  bool visitNullType(NullType node, Set<TypedefType> visitedTypedefs) => false;
+
+  @override
   bool visitBottomType(BottomType node, Set<TypedefType> visitedTypedefs) =>
       false;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index afa72c8..a1167d5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -340,10 +340,6 @@
       await loader.buildOutlines();
       loader.createTypeInferenceEngine();
       loader.coreLibrary.becomeCoreLibrary();
-      dynamicType.bind(
-          loader.coreLibrary.lookupLocalMember("dynamic", required: true));
-      bottomType
-          .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
       loader.resolveParts();
       loader.computeLibraryScopes();
       setupTopAndBottomTypes();
@@ -844,11 +840,13 @@
   void setupTopAndBottomTypes() {
     objectType
         .bind(loader.coreLibrary.lookupLocalMember("Object", required: true));
-
+    dynamicType
+        .bind(loader.coreLibrary.lookupLocalMember("dynamic", required: true));
     ClassBuilder nullClassBuilder =
         loader.coreLibrary.lookupLocalMember("Null", required: true);
-    nullClassBuilder.isNullClass = true;
-    nullType.bind(nullClassBuilder);
+    nullType.bind(nullClassBuilder..isNullClass = true);
+    bottomType
+        .bind(loader.coreLibrary.lookupLocalMember("Never", required: true));
   }
 
   void computeCoreTypes() {
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 9143dcb..1fd20cd 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -14,6 +14,7 @@
         InvalidType,
         NamedType,
         NeverType,
+        NullType,
         TypeParameter,
         TypeParameterType,
         TypedefType,
@@ -1021,6 +1022,8 @@
 
   bool visitNeverType(NeverType node) => false;
 
+  bool visitNullType(NullType node) => false;
+
   bool visitInterfaceType(InterfaceType node) {
     return anyTypeVariables(node.typeArguments);
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 28ac4f2..a02abb4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -21,6 +21,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         TreeNode,
         TypeParameter,
         TypeParameterType,
@@ -36,6 +37,7 @@
 import '../builder/library_builder.dart';
 import '../builder/named_type_builder.dart';
 import '../builder/never_type_declaration_builder.dart';
+import '../builder/null_type_declaration_builder.dart';
 import '../builder/nullability_builder.dart';
 import '../builder/type_builder.dart';
 import '../builder/type_variable_builder.dart';
@@ -101,6 +103,17 @@
   }
 
   @override
+  TypeBuilder visitNullType(NullType node) {
+    return new NamedTypeBuilder(
+        "Null",
+        new NullabilityBuilder.nullable(),
+        /* arguments = */ null,
+        /* fileUri = */ null,
+        /* charOffset = */ null)
+      ..bind(new NullTypeDeclarationBuilder(node, loader.coreLibrary, -1));
+  }
+
+  @override
   TypeBuilder visitInterfaceType(InterfaceType node) {
     ClassBuilder cls =
         loader.computeClassBuilderFromTargetClass(node.classNode);
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index c4a6bc5..76a901f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -26,6 +26,7 @@
         MapConstant,
         NeverType,
         NullConstant,
+        NullType,
         Nullability,
         PartialInstantiationConstant,
         Procedure,
@@ -158,6 +159,10 @@
     addNullability(node.declaredNullability);
   }
 
+  void visitNullType(NullType node) {
+    result.add("Null");
+  }
+
   void visitDynamicType(DynamicType node) {
     result.add("dynamic");
   }
@@ -255,12 +260,6 @@
       }
       result.add(">");
     }
-    if (classNode.name == 'Null' &&
-        classNode.enclosingLibrary.importUri.scheme == 'dart' &&
-        classNode.enclosingLibrary.importUri.path == 'core') {
-      // Don't print nullability on `Null`.
-      return;
-    }
     addNullability(node.nullability);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 3bc4b4c..68fdfc8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -256,15 +256,7 @@
     exitTreeNode(node);
   }
 
-  bool isNullType(DartType node) {
-    if (node is InterfaceType) {
-      Uri importUri = node.classNode.enclosingLibrary.importUri;
-      return node.classNode.name == "Null" &&
-          importUri.scheme == "dart" &&
-          importUri.path == "core";
-    }
-    return false;
-  }
+  bool isNullType(DartType node) => node is NullType;
 
   bool isObjectClass(Class c) {
     return c.name == "Object" &&
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 710d78e..31186d8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -429,7 +429,7 @@
     Library library = libraryBuilder.library;
     final DartType bottomType = library.isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
 
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssues(
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 f34bede..e4d81e4 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
@@ -38,6 +38,7 @@
         Name,
         NeverType,
         NonNullableByDefaultCompiledMode,
+        NullType,
         Nullability,
         Procedure,
         ProcedureKind,
@@ -1379,6 +1380,12 @@
         -1);
   }
 
+  void addSyntheticDeclarationOfNull() {
+    // TODO(dmitryas): Uncomment the following when the Null class is removed
+    // from the SDK.
+    //addBuilder("Null", new NullTypeBuilder(const NullType(), this, -1), -1);
+  }
+
   TypeBuilder addNamedType(Object name, NullabilityBuilder nullabilityBuilder,
       List<TypeBuilder> arguments, int charOffset) {
     return addType(
@@ -3340,7 +3347,7 @@
       List<TypeParameter> typeParameters, Uri fileUri) {
     final DartType bottomType = library.isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
 
     // Check in bounds of own type variables.
     for (TypeParameter parameter in typeParameters) {
@@ -3426,7 +3433,7 @@
     if (returnType != null) {
       final DartType bottomType = isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
-          : typeEnvironment.nullType;
+          : const NullType();
       Set<TypeArgumentIssue> issues = {};
       issues.addAll(findTypeArgumentIssues(library, returnType, typeEnvironment,
               SubtypeCheckMode.ignoringNullabilities, bottomType,
@@ -3536,7 +3543,7 @@
       {bool inferred, bool allowSuperBounded = true}) {
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssues(library, type, typeEnvironment,
             SubtypeCheckMode.ignoringNullabilities, bottomType,
@@ -3603,7 +3610,7 @@
 
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssuesForInvocation(
             library,
@@ -3690,7 +3697,7 @@
 
     final DartType bottomType = isNonNullableByDefault
         ? const NeverType(Nullability.nonNullable)
-        : typeEnvironment.nullType;
+        : const NullType();
     Set<TypeArgumentIssue> issues = {};
     issues.addAll(findTypeArgumentIssuesForInvocation(
             library,
diff --git a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
index 9ca2af0..b646152 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/closure_context.dart
@@ -151,7 +151,7 @@
         // dynamic, or Null.
         if (returnType is VoidType ||
             returnType is DynamicType ||
-            returnType == inferrer.coreTypes.nullType) {
+            returnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -172,7 +172,7 @@
         if (returnType is VoidType &&
             !(expressionType is VoidType ||
                 expressionType is DynamicType ||
-                expressionType == inferrer.coreTypes.nullType)) {
+                expressionType is NullType)) {
           // It is a compile-time error if s is `return e;`, T is void, and S is
           // neither void, dynamic, nor Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -213,7 +213,7 @@
         // `return;` is a valid return if T is void, dynamic, or Null.
         if (returnType is VoidType ||
             returnType is DynamicType ||
-            returnType == inferrer.coreTypes.nullType) {
+            returnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -238,7 +238,7 @@
         } else if (returnType is VoidType &&
             expressionType is! VoidType &&
             expressionType is! DynamicType &&
-            expressionType != inferrer.coreTypes.nullType) {
+            expressionType is! NullType) {
           // Invalid if T is void and S is not void, dynamic, or Null
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -249,7 +249,7 @@
         } else if (expressionType is VoidType &&
             returnType is! VoidType &&
             returnType is! DynamicType &&
-            returnType != inferrer.coreTypes.nullType) {
+            returnType is! NullType) {
           // Invalid if S is void and T is not void, dynamic, or Null.
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -302,7 +302,7 @@
     if (inferrer.isNonNullableByDefault) {
       if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        actualReturnedType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
@@ -368,11 +368,11 @@
         }
       } else if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        actualReturnedType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
-        actualReturnedType = inferrer.typeSchemaEnvironment.nullType;
+        actualReturnedType = const NullType();
       }
 
       if (!inferrer.typeSchemaEnvironment.isSubtypeOf(actualReturnedType,
@@ -493,7 +493,7 @@
         // dynamic, or Null.
         if (futureValueType is VoidType ||
             futureValueType is DynamicType ||
-            futureValueType == inferrer.coreTypes.nullType) {
+            futureValueType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -518,7 +518,7 @@
         if (futureValueType is VoidType &&
             !(flattenedExpressionType is VoidType ||
                 flattenedExpressionType is DynamicType ||
-                flattenedExpressionType == inferrer.coreTypes.nullType)) {
+                flattenedExpressionType is NullType)) {
           // It is a compile-time error if s is `return e;`, T_v is void, and
           // flatten(S) is neither void, dynamic, Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -571,7 +571,7 @@
         // `return;` is a valid return if flatten(T) is void, dynamic, or Null.
         if (flattenedReturnType is VoidType ||
             flattenedReturnType is DynamicType ||
-            flattenedReturnType == inferrer.coreTypes.nullType) {
+            flattenedReturnType is NullType) {
           // Valid return;
         } else {
           statement.expression = inferrer.helper.wrapInProblem(
@@ -606,7 +606,7 @@
         } else if (returnType is VoidType &&
             flattenedExpressionType is! VoidType &&
             flattenedExpressionType is! DynamicType &&
-            flattenedExpressionType != inferrer.coreTypes.nullType) {
+            flattenedExpressionType is! NullType) {
           // Invalid if T is void and flatten(S) is not void, dynamic, or Null.
           statement.expression = inferrer.helper.wrapInProblem(
               statement.expression,
@@ -617,7 +617,7 @@
         } else if (flattenedExpressionType is VoidType &&
             flattenedReturnType is! VoidType &&
             flattenedReturnType is! DynamicType &&
-            flattenedReturnType != inferrer.coreTypes.nullType) {
+            flattenedReturnType is! NullType) {
           // Invalid if flatten(S) is void and flatten(T) is not void, dynamic,
           // or Null.
           statement.expression = inferrer.helper.wrapInProblem(
@@ -695,7 +695,7 @@
     if (inferrer.isNonNullableByDefault) {
       if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally; that
         // is, it throws.
@@ -761,11 +761,11 @@
         }
       } else if (hasImplicitReturn) {
         // No explicit returns we have an implicit `return null`.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       } else {
         // No explicit return and the function doesn't complete normally;
         // that is, it throws.
-        inferredType = inferrer.typeSchemaEnvironment.nullType;
+        inferredType = const NullType();
       }
       inferredType =
           inferrer.wrapFutureType(inferredType, inferrer.library.nonNullable);
@@ -920,14 +920,14 @@
       }
     } else if (hasImplicitReturn) {
       // No explicit returns we have an implicit `return null`.
-      inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+      inferredElementType = const NullType();
     } else {
       // No explicit return and the function doesn't complete normally; that is,
       // it throws.
       if (inferrer.isNonNullableByDefault) {
         inferredElementType = new NeverType(inferrer.library.nonNullable);
       } else {
-        inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+        inferredElementType = const NullType();
       }
     }
 
@@ -1045,14 +1045,14 @@
       }
     } else if (hasImplicitReturn) {
       // No explicit returns we have an implicit `return null`.
-      inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+      inferredElementType = const NullType();
     } else {
       // No explicit return and the function doesn't complete normally; that is,
       // it throws.
       if (inferrer.isNonNullableByDefault) {
         inferredElementType = new NeverType(inferrer.library.nonNullable);
       } else {
-        inferredElementType = inferrer.typeSchemaEnvironment.nullType;
+        inferredElementType = const NullType();
       }
     }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
index 572423e..8710222 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/factor_type.dart
@@ -23,7 +23,7 @@
     }
     DartType factor_RS = factorType(typeEnvironment, R, S);
     if (typeEnvironment.isSubtypeOf(
-        typeEnvironment.nullType, S, SubtypeCheckMode.withNullabilities)) {
+        const NullType(), S, SubtypeCheckMode.withNullabilities)) {
       return factor_RS;
     } else {
       return factor_RS.withDeclaredNullability(Nullability.nullable);
@@ -36,7 +36,7 @@
     DartType R = T.withDeclaredNullability(Nullability.nonNullable);
     DartType factor_RS = factorType(typeEnvironment, R, S);
     if (typeEnvironment.isSubtypeOf(
-        typeEnvironment.nullType, S, SubtypeCheckMode.withNullabilities)) {
+        const NullType(), S, SubtypeCheckMode.withNullabilities)) {
       return factor_RS;
     } else {
       return factor_RS.withDeclaredNullability(Nullability.legacy);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
index 133297c..4b5d0f8 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart
@@ -293,7 +293,7 @@
     // it return `true` for both Null and bottom types?  Revisit this once
     // enough functionality is implemented that we can compare the behavior with
     // the old analyzer-based implementation.
-    return type == coreTypes.nullType;
+    return type is NullType;
   }
 
   /// Matches [p] against [q] as a subtype against supertype.
@@ -405,9 +405,7 @@
     // Only if P0 is a subtype match for Q under constraint set C.
     if (isLegacyTypeConstructorApplication(p, _currentLibrary)) {
       return _isNullabilityAwareSubtypeMatch(
-          computeTypeWithoutNullabilityMarker(p, _currentLibrary,
-              nullType: coreTypes.nullType),
-          q,
+          computeTypeWithoutNullabilityMarker(p, _currentLibrary), q,
           constrainSupertype: constrainSupertype);
     }
 
@@ -422,9 +420,7 @@
 
       if ((p is DynamicType || p is VoidType) &&
           _isNullabilityAwareSubtypeMatch(
-              p,
-              computeTypeWithoutNullabilityMarker(q, _currentLibrary,
-                  nullType: coreTypes.nullType),
+              p, computeTypeWithoutNullabilityMarker(q, _currentLibrary),
               constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -487,17 +483,14 @@
     // Or if P is a subtype match for Q0 under non-empty constraint set C.
     // Or if P is a subtype match for Null under constraint set C.
     // Or if P is a subtype match for Q0 under empty constraint set C.
-    if (isNullableTypeConstructorApplication(q, nullType: coreTypes.nullType)) {
+    if (isNullableTypeConstructorApplication(q)) {
       final int baseConstraintCount = _protoConstraints.length;
-      final DartType rawP = computeTypeWithoutNullabilityMarker(
-          p, _currentLibrary,
-          nullType: coreTypes.nullType);
-      final DartType rawQ = computeTypeWithoutNullabilityMarker(
-          q, _currentLibrary,
-          nullType: coreTypes.nullType);
+      final DartType rawP =
+          computeTypeWithoutNullabilityMarker(p, _currentLibrary);
+      final DartType rawQ =
+          computeTypeWithoutNullabilityMarker(q, _currentLibrary);
 
-      if (isNullableTypeConstructorApplication(p,
-              nullType: coreTypes.nullType) &&
+      if (isNullableTypeConstructorApplication(p) &&
           _isNullabilityAwareSubtypeMatch(rawP, rawQ,
               constrainSupertype: constrainSupertype)) {
         return true;
@@ -521,7 +514,7 @@
       }
       _protoConstraints.length = baseConstraintCount;
 
-      if (_isNullabilityAwareSubtypeMatch(p, coreTypes.nullType,
+      if (_isNullabilityAwareSubtypeMatch(p, const NullType(),
           constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -553,14 +546,12 @@
     //
     // If P0 is a subtype match for Q under constraint set C1.
     // And if Null is a subtype match for Q under constraint set C2.
-    if (isNullableTypeConstructorApplication(p, nullType: coreTypes.nullType)) {
+    if (isNullableTypeConstructorApplication(p)) {
       final int baseConstraintCount = _protoConstraints.length;
       if (_isNullabilityAwareSubtypeMatch(
-              computeTypeWithoutNullabilityMarker(p, _currentLibrary,
-                  nullType: coreTypes.nullType),
-              q,
+              computeTypeWithoutNullabilityMarker(p, _currentLibrary), q,
               constrainSupertype: constrainSupertype) &&
-          _isNullabilityAwareSubtypeMatch(coreTypes.nullType, q,
+          _isNullabilityAwareSubtypeMatch(const NullType(), q,
               constrainSupertype: constrainSupertype)) {
         return true;
       }
@@ -590,7 +581,7 @@
     // If P is Null, then the match holds under no constraints:
     //
     // Only if Q is nullable.
-    if (p == coreTypes.nullType) {
+    if (p is NullType) {
       return q.nullability == Nullability.nullable;
     }
 
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index 7e46518..1a58eb6 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -17,6 +17,7 @@
         Member,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         Statement,
         TreeNode,
@@ -270,7 +271,7 @@
     } else if (isSubtypeOf(
         type, typeEnvironment.coreTypes.objectNonNullableRawType)) {
       return TypeClassification.nonNullable;
-    } else if (isSubtypeOf(type, typeEnvironment.coreTypes.nullType)) {
+    } else if (isSubtypeOf(type, const NullType())) {
       return TypeClassification.nullOrEquivalent;
     } else {
       return TypeClassification.potentiallyNullable;
@@ -308,7 +309,7 @@
             type.parameter, type.declaredNullability, bound);
       }
       return type;
-    } else if (type == typeEnvironment.nullType) {
+    } else if (type is NullType) {
       return const NeverType(Nullability.nonNullable);
     }
     return type.withDeclaredNullability(Nullability.nonNullable);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 8207e58..682b6ef 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -240,7 +240,7 @@
 
   DartType get bottomType => isNonNullableByDefault
       ? const NeverType(Nullability.nonNullable)
-      : engine.coreTypes.nullType;
+      : const NullType();
 
   DartType computeGreatestClosure(DartType type) {
     return greatestClosure(type, const DynamicType(), bottomType);
@@ -256,14 +256,14 @@
   }
 
   DartType computeNullable(DartType type) {
-    if (type == coreTypes.nullType || type is NeverType) {
-      return coreTypes.nullType;
+    if (type is NullType || type is NeverType) {
+      return const NullType();
     }
     return type.withDeclaredNullability(library.nullable);
   }
 
   DartType computeNonNullable(DartType type) {
-    if (type == coreTypes.nullType) {
+    if (type is NullType) {
       return isNonNullableByDefault
           ? const NeverType(Nullability.nonNullable)
           : type;
@@ -734,7 +734,7 @@
   }
 
   bool isNull(DartType type) {
-    return type is InterfaceType && type.classNode == coreTypes.nullClass;
+    return type is NullType;
   }
 
   /// Computes the type arguments for an access to an extension instance member
@@ -976,7 +976,7 @@
         case Nullability.nullable:
         case Nullability.legacy:
           // Never? and Never* are equivalent to Null.
-          return findInterfaceMember(coreTypes.nullType, name, fileOffset);
+          return findInterfaceMember(const NullType(), name, fileOffset);
         case Nullability.undetermined:
           return internalProblem(
               templateInternalProblemUnsupportedNullability.withArguments(
@@ -1570,9 +1570,7 @@
       assert(isTopLevel, "No initializer type provided.");
       return null;
     }
-    if (initializerType is BottomType ||
-        (initializerType is InterfaceType &&
-            initializerType.classNode == coreTypes.nullClass)) {
+    if (initializerType is BottomType || initializerType is NullType) {
       // If the initializer type is Null or bottom, the inferred type is
       // dynamic.
       // TODO(paulberry): this rule is inherited from analyzer behavior but is
@@ -2260,7 +2258,7 @@
               substitution.substituteType(formalTypesFromContext[i]));
           if (typeSchemaEnvironment.isSubtypeOf(
               inferredType,
-              coreTypes.nullType,
+              const NullType(),
               isNonNullableByDefault
                   ? SubtypeCheckMode.withNullabilities
                   : SubtypeCheckMode.ignoringNullabilities)) {
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
index 6401112..e6338be 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_elimination.dart
@@ -80,10 +80,7 @@
             topType.classNode.enclosingLibrary.importUri.path == "core" &&
             topType.classNode.name == "Object");
     assert(bottomType == const NeverType(Nullability.nonNullable) ||
-        bottomType is InterfaceType &&
-            bottomType.classNode.enclosingLibrary.importUri.scheme == "dart" &&
-            bottomType.classNode.enclosingLibrary.importUri.path == "core" &&
-            bottomType.classNode.name == "Null");
+        bottomType is NullType);
     _TypeSchemaEliminationVisitor visitor =
         new _TypeSchemaEliminationVisitor(isLeastClosure, topType, bottomType);
     DartType result = schema.accept(visitor);
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
index d467fb7..59cbd3c 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema_environment.dart
@@ -267,7 +267,7 @@
         returnContextType = new TypeVariableEliminator(
                 clientLibrary.isNonNullableByDefault
                     ? const NeverType(Nullability.nonNullable)
-                    : nullType,
+                    : const NullType(),
                 clientLibrary.isNonNullableByDefault
                     ? objectNullableRawType
                     : objectLegacyRawType)
@@ -431,7 +431,7 @@
       TypeConstraint constraint, DartType topType, DartType bottomType,
       {bool grounded: false, bool isContravariant: false}) {
     assert(bottomType == const NeverType(Nullability.nonNullable) ||
-        bottomType == coreTypes.nullType);
+        bottomType == const NullType());
     if (!isContravariant) {
       // Prefer the known bound, if any.
       if (isKnown(constraint.lower)) return constraint.lower;
@@ -504,7 +504,7 @@
             : const DynamicType(),
         clientLibrary.isNonNullableByDefault
             ? const NeverType(Nullability.nonNullable)
-            : nullType,
+            : const NullType(),
         grounded: true,
         isContravariant: isContravariant);
   }
@@ -518,7 +518,7 @@
             : const DynamicType(),
         clientLibrary.isNonNullableByDefault
             ? const NeverType(Nullability.nonNullable)
-            : nullType);
+            : const NullType());
     if (!isKnown(t)) {
       return t;
     }
@@ -540,7 +540,7 @@
               : const DynamicType(),
           clientLibrary.isNonNullableByDefault
               ? const NeverType(Nullability.nonNullable)
-              : nullType);
+              : const NullType());
     }
     return t;
   }
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
index 2d8e634..1b71339 100644
--- a/pkg/front_end/lib/src/testing/id_testing_utils.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -467,6 +467,10 @@
     }
   }
 
+  void visitNullType(NullType node) {
+    sb.write('Null');
+  }
+
   void visitInterfaceType(InterfaceType node) {
     sb.write(node.classNode.name);
     if (node.typeArguments.isNotEmpty) {
@@ -570,11 +574,7 @@
 }
 
 /// Returns `true` if [type] is `Null` from `dart:core`.
-bool isNull(DartType type) {
-  return type is InterfaceType &&
-      type.classNode.name == 'Null' &&
-      '${type.classNode.enclosingLibrary.importUri}' == 'dart:core';
-}
+bool isNull(DartType type) => type is NullType;
 
 /// Returns a textual representation of the [typeParameter] to be used in
 /// testing.
diff --git a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
index 4310dac..f68d6d5 100644
--- a/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/factor_type_test.dart
@@ -63,7 +63,7 @@
   DartType get intStar => coreTypes.intLegacyRawType;
 
   @override
-  DartType get nullNone => coreTypes.nullType;
+  DartType get nullNone => const NullType();
 
   @override
   DartType get numNone => coreTypes.numNonNullableRawType;
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
index 884c0ce..d070369 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_nnbd_test.dart
@@ -81,8 +81,6 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get P => coreTypes.legacyRawType(classP);
@@ -280,8 +278,8 @@
   }
 
   void test_null_subtype_any() {
-    _checkConstraintsLower(T1, nullType, testLib, ['dart.core::Null? <: T1']);
-    _checkConstraintsUpper(nullType, Q, testLib, []);
+    _checkConstraintsLower(T1, new NullType(), testLib, ['Null <: T1']);
+    _checkConstraintsUpper(new NullType(), Q, testLib, []);
   }
 
   void test_parameter_subtype_any() {
diff --git a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
index cb0ec2f..ebdb227 100644
--- a/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_constraint_gatherer_test.dart
@@ -63,8 +63,6 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get objectType => coreTypes.objectLegacyRawType;
@@ -218,8 +216,8 @@
   }
 
   void test_null_subtype_any() {
-    _checkConstraintsLower(T1, nullType, testLib, ['dart.core::Null? <: T1']);
-    _checkConstraintsUpper(nullType, Q, testLib, []);
+    _checkConstraintsLower(T1, new NullType(), testLib, ['Null <: T1']);
+    _checkConstraintsUpper(new NullType(), Q, testLib, []);
   }
 
   void test_parameter_subtype_any() {
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
index cc03f2a..dcad472 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_nnbd_test.dart
@@ -24,7 +24,7 @@
 
   DartType get dynamicType => const DynamicType();
 
-  DartType get nullType => coreTypes.nullType;
+  DartType get nullType => new NullType();
 
   DartType greatestClosure(DartType schema) {
     return typeSchemaElimination.greatestClosure(
@@ -140,19 +140,11 @@
   final Class listClass = new Class(name: 'List');
 
   @override
-  final Class nullClass = new Class(name: 'Null');
-
-  @override
   final Class objectClass = new Class(name: 'Object');
 
-  @override
-  InterfaceType nullType;
-
   _MockCoreTypes() {
-    nullType = new InterfaceType(
-        nullClass, Nullability.nullable, const <DynamicType>[]);
     new Library(Uri.parse('dart:core'),
-        name: 'dart.core', classes: [listClass, nullClass, objectClass]);
+        name: 'dart.core', classes: [listClass, objectClass]);
   }
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
index d7cf9e6..a4c8ee3 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_elimination_test.dart
@@ -24,16 +24,16 @@
 
   DartType get dynamicType => const DynamicType();
 
-  DartType get nullType => coreTypes.nullType;
-
   DartType get objectType => coreTypes.objectLegacyRawType;
 
   DartType greatestClosure(DartType schema) {
-    return typeSchemaElimination.greatestClosure(schema, dynamicType, nullType);
+    return typeSchemaElimination.greatestClosure(
+        schema, dynamicType, const NullType());
   }
 
   DartType leastClosure(DartType schema) {
-    return typeSchemaElimination.leastClosure(schema, dynamicType, nullType);
+    return typeSchemaElimination.leastClosure(
+        schema, dynamicType, const NullType());
   }
 
   void test_greatestClosure_contravariant() {
@@ -41,12 +41,12 @@
         greatestClosure(new FunctionType(
                 [unknownType], dynamicType, Nullability.legacy))
             .leakingDebugToString(),
-        '(dart.core::Null?) →* dynamic');
+        '(Null) →* dynamic');
     expect(
         greatestClosure(new FunctionType([], dynamicType, Nullability.legacy,
                 namedParameters: [new NamedType('foo', unknownType)]))
             .leakingDebugToString(),
-        '({foo: dart.core::Null?}) →* dynamic');
+        '({foo: Null}) →* dynamic');
   }
 
   void test_greatestClosure_contravariant_contravariant() {
@@ -78,8 +78,7 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).leakingDebugToString(),
-        '(dart.core::Null?, dart.core::Null?, {a: dart.core::Null?, '
-        'b: dart.core::Null?}) →* dynamic');
+        '(Null, Null, {a: Null, b: Null}) →* dynamic');
   }
 
   void test_greatestClosure_simple() {
@@ -105,19 +104,19 @@
           new FunctionType([unknownType], dynamicType, Nullability.legacy)
         ], dynamicType, Nullability.legacy))
             .leakingDebugToString(),
-        '((dart.core::Null?) →* dynamic) →* dynamic');
+        '((Null) →* dynamic) →* dynamic');
   }
 
   void test_leastClosure_covariant() {
     expect(
         leastClosure(new FunctionType([], unknownType, Nullability.legacy))
             .leakingDebugToString(),
-        '() →* dart.core::Null?');
+        '() →* Null');
     expect(
         leastClosure(new InterfaceType(
                 coreTypes.listClass, Nullability.legacy, [unknownType]))
             .leakingDebugToString(),
-        'dart.core::List<dart.core::Null?>*');
+        'dart.core::List<Null>*');
   }
 
   void test_leastClosure_function_multipleUnknown() {
@@ -128,12 +127,11 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).leakingDebugToString(),
-        '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* dart.core::Null?');
+        '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* Null');
   }
 
   void test_leastClosure_simple() {
-    expect(
-        leastClosure(unknownType).leakingDebugToString(), 'dart.core::Null?');
+    expect(leastClosure(unknownType).leakingDebugToString(), 'Null');
   }
 }
 
@@ -142,19 +140,11 @@
   final Class listClass = new Class(name: 'List');
 
   @override
-  final Class nullClass = new Class(name: 'Null');
-
-  @override
   final Class objectClass = new Class(name: 'Object');
 
-  @override
-  InterfaceType nullType;
-
   _MockCoreTypes() {
-    nullType = new InterfaceType(
-        nullClass, Nullability.nullable, const <DynamicType>[]);
     new Library(Uri.parse('dart:core'),
-        name: 'dart.core', classes: [listClass, nullClass, objectClass]);
+        name: 'dart.core', classes: [listClass, objectClass]);
   }
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
index f7b5496..9e5df47 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_nnbd_test.dart
@@ -658,7 +658,7 @@
           [
             coreTypes.intNonNullableRawType,
             coreTypes.doubleNonNullableRawType,
-            coreTypes.nullType
+            const NullType()
           ],
           null,
           inferredTypes,
diff --git a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
index aedad18..24ef0a4 100644
--- a/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
+++ b/pkg/front_end/test/fasta/type_inference/type_schema_environment_test.dart
@@ -50,15 +50,13 @@
 
   Class get mapClass => coreTypes.mapClass;
 
-  InterfaceType get nullType => coreTypes.nullType;
-
   InterfaceType get numType => coreTypes.numLegacyRawType;
 
   Class get objectClass => coreTypes.objectClass;
 
   InterfaceType get objectType => coreTypes.objectLegacyRawType;
 
-  DartType get bottomType => nullType;
+  DartType get bottomType => const NullType();
 
   DartType get topType => const DynamicType();
 
@@ -672,7 +670,7 @@
             topType,
             bottomType,
             grounded: true),
-        new InterfaceType(A.classNode, Nullability.legacy, [nullType]));
+        new InterfaceType(A.classNode, Nullability.legacy, [const NullType()]));
     // Solve(? <: T <: A) => A
     expect(
         env.solveTypeConstraint(_makeConstraint(upper: A), topType, bottomType),
@@ -776,7 +774,7 @@
             topType,
             bottomType,
             grounded: true),
-        new InterfaceType(B.classNode, Nullability.legacy, [nullType]));
+        new InterfaceType(B.classNode, Nullability.legacy, [const NullType()]));
   }
 
   void test_typeConstraint_default() {
diff --git a/pkg/front_end/test/id_tests/inheritance_test.dart b/pkg/front_end/test/id_tests/inheritance_test.dart
index 2089d9a..f39b8d2 100644
--- a/pkg/front_end/test/id_tests/inheritance_test.dart
+++ b/pkg/front_end/test/id_tests/inheritance_test.dart
@@ -125,8 +125,7 @@
       InterfaceType supertype = _hierarchy.getTypeAsInstanceOf(
           _coreTypes.thisInterfaceType(node, node.enclosingLibrary.nonNullable),
           member.enclosingClass,
-          node.enclosingLibrary,
-          _coreTypes);
+          node.enclosingLibrary);
       Substitution substitution = Substitution.fromInterfaceType(supertype);
       DartType type;
       if (member is Procedure) {
diff --git a/pkg/front_end/test/incremental_compiler_leak_test.dart b/pkg/front_end/test/incremental_compiler_leak_test.dart
index e526d98..7d3fcd7 100644
--- a/pkg/front_end/test/incremental_compiler_leak_test.dart
+++ b/pkg/front_end/test/incremental_compiler_leak_test.dart
@@ -192,6 +192,8 @@
       if (classDetails.name == "ConstructorScope") return true;
       if (classDetails.name == "ScopeBuilder") return true;
       if (classDetails.name == "ConstructorScopeBuilder") return true;
+      if (classDetails.name == "NullTypeDeclarationBuilder") return true;
+      if (classDetails.name == "NullabilityBuilder") return true;
 
       return false;
     } else if (uriString.startsWith("package:kernel/")) {
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 20db3c3..d910513 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1213,6 +1213,7 @@
 unification
 unifier
 unify
+uninstantiable
 unions
 uniqueness
 unittest
diff --git a/pkg/front_end/test/spell_checking_list_common.txt b/pkg/front_end/test/spell_checking_list_common.txt
index d9b9520..5255e56 100644
--- a/pkg/front_end/test/spell_checking_list_common.txt
+++ b/pkg/front_end/test/spell_checking_list_common.txt
@@ -434,6 +434,7 @@
 checking
 checkpoints
 checks
+chian
 child
 children
 choice
@@ -863,6 +864,7 @@
 disable
 disabled
 disabling
+disallowed
 disambiguate
 disambiguated
 disappear
@@ -2913,6 +2915,7 @@
 suppress
 suppressed
 sure
+surface
 surrogate
 surrogates
 surrounding
diff --git a/pkg/front_end/test/text_representation/data/types_opt_out.dart b/pkg/front_end/test/text_representation/data/types_opt_out.dart
index b302015..169f717 100644
--- a/pkg/front_end/test/text_representation/data/types_opt_out.dart
+++ b/pkg/front_end/test/text_representation/data/types_opt_out.dart
@@ -24,7 +24,7 @@
     String /*normal|limited.String**/ /*verbose.dart.core::String**/ o) {}
 voidType(void /*void*/ o) {}
 dynamicType(dynamic /*dynamic*/ o) {}
-neverType(Never /*normal|limited.Null?*/ /*verbose.dart.core::Null?*/ o) {}
+neverType(Never /*normal|limited.Null*/ /*verbose.Null*/ o) {}
 objectType(
     Object /*normal|limited.Object**/ /*verbose.dart.core::Object**/ o) {}
 genericType1(
diff --git a/pkg/front_end/testcases/agnostic/as.dart.outline.expect b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
index b6d34a3..7b8b8ac 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::List<core::int> a = const <core::Null?>[] as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> a = const <Null>[] as{ForNonNullableByDefault} core::List<core::int>;
 static const field core::List<core::int> b = const <core::int?>[] as{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:5:17 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///as.dart:6:17 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/agnostic/as.dart.weak.expect b/pkg/front_end/testcases/agnostic/as.dart.weak.expect
index cc4ac88..f28c31a 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.weak.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.weak.expect
@@ -7,6 +7,6 @@
 static method main() → void {}
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect b/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
index cc4ac88..f28c31a 100644
--- a/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/agnostic/as.dart.weak.transformed.expect
@@ -7,6 +7,6 @@
 static method main() → void {}
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/agnostic/is.dart.outline.expect b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
index 0046b04..62c76b3 100644
--- a/pkg/front_end/testcases/agnostic/is.dart.outline.expect
+++ b/pkg/front_end/testcases/agnostic/is.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::bool a = const <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool a = const <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool b = const <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:5:17 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///is.dart:6:17 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 4, effectively constant: 2
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
index 4842362..e5b3c04 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = main::id<dynamic>(x);
   };
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
index 5d5e32a..bbce9bb 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = new main::A::•<dynamic>();
   };
diff --git a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
index 45805ec..5944c43 100644
--- a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     new main::A::•<dynamic>();
     #C2;
   };
diff --git a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
index 4bc18c6..430f437 100644
--- a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
@@ -4,7 +4,7 @@
            ^^^^^^^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     throw new dart.core::AbstractClassInstantiationError::•("Process");
     dart.io::File::fromUri(dart.core::Uri::parse("file://test.dart"));
   };
diff --git a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
index 36a812e..ccedccc 100644
--- a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x, dynamic y) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     x = x.+(y);
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index c02e68e..d488d56 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -5,6 +5,6 @@
               ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\n  T k = new A();\n            ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
index a7a450a..4e5bdde 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* k = null;
     k = main::id<main::A::debugExpr::T*>(k);
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
index 50019f0..a632a3c 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>(dynamic x) → dynamic
-  return () → dart.core::Null? {
+  return () → Null {
     main::A::debugExpr::T* x = null;
   };
diff --git a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
index 69565ac..e1fc1ee 100644
--- a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.expect
@@ -82,18 +82,18 @@
   field field7 = self::E|field7;
 }
 static field invalid-type E|field1 = null;
-static field core::int* E|field2 = (() → core::Null? {
+static field core::int* E|field2 = (() → Null {
   invalid-type x = null;
   return null;
 }).call();
 static field core::List<invalid-type>* E|field3 = null;
 static field (invalid-type) →* invalid-type E|field4 = null;
 static field (core::List<invalid-type>*) →* core::List<invalid-type>* E|field5 = null;
-static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<core::String*>();
-static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<invalid-type>();
diff --git a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
index 69565ac..e1fc1ee 100644
--- a/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_field_with_type_parameter_usage.dart.strong.transformed.expect
@@ -82,18 +82,18 @@
   field field7 = self::E|field7;
 }
 static field invalid-type E|field1 = null;
-static field core::int* E|field2 = (() → core::Null? {
+static field core::int* E|field2 = (() → Null {
   invalid-type x = null;
   return null;
 }).call();
 static field core::List<invalid-type>* E|field3 = null;
 static field (invalid-type) →* invalid-type E|field4 = null;
 static field (core::List<invalid-type>*) →* core::List<invalid-type>* E|field5 = null;
-static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field6 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<core::String*>();
-static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → core::Null? {
+static field core::int* E|field7 = (<E extends core::Object* = dynamic>() → Null {
   E* x = null;
   return null;
 }).call<invalid-type>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
index 98f08d2..dbe9bc2 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.expect
@@ -206,11 +206,11 @@
   self::expect(1, let final self::Class* #t106 = c in let final core::int* #t107 = self::Extension|get#simpleSetter(#t106) in #t107.{core::num::==}(null) ?{core::int*} let final core::int* #t108 = 2 in let final void #t109 = self::Extension|set#simpleSetter(#t106, #t108) in #t108 : #t107);
   c.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t110 = c in let final core::int* #t111 = self::Extension|get#simpleSetter(#t110) in #t111.{core::num::==}(null) ?{core::int*} let final core::int* #t112 = 2 in let final void #t113 = self::Extension|set#simpleSetter(#t110, #t112) in #t112 : #t111);
-  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{core::Null?} null : #t114.{self::Class::field} = null;
+  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{Null} null : #t114.{self::Class::field} = null;
   let final self::Class* #t115 = c in #t115.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t115).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t115, 1) : null;
   self::expect(1, let final self::Class* #t116 = c in #t116.{self::Class::==}(null) ?{core::int*} null : #t116.{self::Class::field});
   self::expect(1, let final self::Class* #t117 = c in #t117.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t118 = self::Extension|get#simpleSetter(#t117) in #t118.{core::num::==}(null) ?{core::int*} let final core::int* #t119 = 2 in let final void #t120 = self::Extension|set#simpleSetter(#t117, #t119) in #t119 : #t118);
-  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{core::Null?} null : #t121.{self::Class::field} = null;
+  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{Null} null : #t121.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t122 = c in #t122.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t123 = self::Extension|get#simpleSetter(#t122) in #t123.{core::num::==}(null) ?{core::int*} let final core::int* #t124 = 2 in let final void #t125 = self::Extension|set#simpleSetter(#t122, #t124) in #t124 : #t123);
   self::Extension|testInternal(new self::Class::•());
   self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
index 245ead1..cb01579 100644
--- a/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter.dart.strong.transformed.expect
@@ -206,11 +206,11 @@
   self::expect(1, let final self::Class* #t106 = c in let final core::int* #t107 = self::Extension|get#simpleSetter(#t106) in #t107.{core::num::==}(null) ?{core::int*} let final core::int* #t108 = 2 in let final void #t109 = self::Extension|set#simpleSetter(#t106, #t108) in #t108 : #t107);
   c.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t110 = c in let final core::int* #t111 = self::Extension|get#simpleSetter(#t110) in #t111.{core::num::==}(null) ?{core::int*} let final core::int* #t112 = 2 in let final void #t113 = self::Extension|set#simpleSetter(#t110, #t112) in #t112 : #t111);
-  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{core::Null?} null : #t114.{self::Class::field} = null;
+  let final self::Class* #t114 = c in #t114.{self::Class::==}(null) ?{Null} null : #t114.{self::Class::field} = null;
   let final self::Class* #t115 = c in #t115.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t115).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t115, 1) : null;
   self::expect(1, let final self::Class* #t116 = c in #t116.{self::Class::==}(null) ?{core::int*} null : #t116.{self::Class::field});
   self::expect(1, let final self::Class* #t117 = c in #t117.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t118 = self::Extension|get#simpleSetter(#t117) in #t118.{core::num::==}(null) ?{core::int*} let final core::int* #t119 = 2 in let final void #t120 = self::Extension|set#simpleSetter(#t117, #t119) in #t119 : #t118);
-  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{core::Null?} null : #t121.{self::Class::field} = null;
+  let final self::Class* #t121 = c in #t121.{self::Class::==}(null) ?{Null} null : #t121.{self::Class::field} = null;
   self::expect(2, let final self::Class* #t122 = c in #t122.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t123 = self::Extension|get#simpleSetter(#t122) in #t123.{core::num::==}(null) ?{core::int*} let final core::int* #t124 = 2 in let final void #t125 = self::Extension|set#simpleSetter(#t122, #t124) in #t124 : #t123);
   self::Extension|testInternal(new self::Class::•());
   self::GenericClass<core::int*>* genericClass = new self::GenericClass::•<core::int*>();
diff --git a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
index 917ce53..f0d0e30 100644
--- a/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/extension_setter_error.dart.strong.expect
@@ -34,7 +34,7 @@
   self::expect(null, let final self::GenericClass<core::int*>* #t1 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/extensions/extension_setter_error.dart:13:41: Error: A value of type 'GenericClass<int>' can't be assigned to a variable of type 'GenericClass<double>'.
  - 'GenericClass' is from 'pkg/front_end/testcases/extensions/extension_setter_error.dart'.
   expect(null, GenericExtension<double>(genericClass).setter = null);
-                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final core::Null? #t3 = null in let final void #t4 = self::GenericExtension|set#setter<core::double*>(#t1, #t3) in #t3);
+                                        ^" in genericClass as{TypeError} self::GenericClass<core::double*>* in let final Null #t3 = null in let final void #t4 = self::GenericExtension|set#setter<core::double*>(#t1, #t3) in #t3);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
   if(!expected.{core::Object::==}(actual)) {
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
index f26640b..1511135 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.expect
@@ -11,12 +11,12 @@
 }
 static method main() → void {
   asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* core::Null? #t2 = (dynamic s) → core::Null? {
+  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
     core::print(s);
   } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}, #t2);
 }
 static method Extension|call<T extends core::Object* = dynamic>(final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → core::Null? {
+  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
     onData.call(d);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
index f26640b..1511135 100644
--- a/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/issue40596.dart.strong.transformed.expect
@@ -11,12 +11,12 @@
 }
 static method main() → void {
   asy::StreamController<core::String*>* controller = asy::StreamController::•<core::String*>();
-  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* core::Null? #t2 = (dynamic s) → core::Null? {
+  let final asy::StreamController<core::String*>* #t1 = controller in let final (dynamic) →* Null #t2 = (dynamic s) → Null {
     core::print(s);
   } in self::Extension|call<core::String*>(#t1.{asy::StreamController::stream}, #t2);
 }
 static method Extension|call<T extends core::Object* = dynamic>(final asy::Stream<self::Extension|call::T*>* #this, core::Function* onData) → asy::StreamSubscription<self::Extension|call::T*>* {
-  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → core::Null? {
+  return #this.{asy::Stream::listen}((self::Extension|call::T* d) → Null {
     onData.call(d);
   });
 }
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
index 6609124..fb975d6 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.expect
@@ -56,28 +56,28 @@
   self::expect(null, tearOff.call());
   self::expect(42, let final self::Class* #t20 = c in #t20.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20, #t21) in #t21);
   self::expect(42, tearOff.call());
-  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
+  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{Null} null : let final Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
   self::expect(42, let final self::Class* #t26 = c in #t26.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
-  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
+  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t29, null);
   self::expect(null, let final self::Class* #t30 = c in #t30.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
   self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final core::int* #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32);
   self::expect(42, let final self::Class* #t35 = c in let final core::int* #t36 = self::Extension|get#property(#t35) in #t36.{core::num::==}(null) ?{core::int*} let final core::int* #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36);
-  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
+  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{Null} null : let final Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
   let final self::Class* #t42 = c in self::Extension|get#property(#t42).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t42, 42) : null;
   self::expect(42, let final self::Class* #t43 = c in #t43.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t43));
   let final self::Class* #t44 = c in self::Extension|get#property(#t44).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t44, 87) : null;
   self::expect(42, let final self::Class* #t45 = c in #t45.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t45));
-  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t46, null);
+  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t46, null);
   self::expect(null, let final self::Class* #t47 = c in #t47.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t47));
   self::expect(42, let final self::Class* #t48 = c in let final core::int* #t49 = self::Extension|get#property(#t48) in #t49.{core::num::==}(null) ?{core::int*} let final core::int* #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48, #t50) in #t50 : #t49);
   self::expect(42, let final self::Class* #t52 = c in let final core::int* #t53 = self::Extension|get#property(#t52) in #t53.{core::num::==}(null) ?{core::int*} let final core::int* #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52, #t54) in #t54 : #t53);
-  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t56, null);
+  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t56, null);
   self::expect(null, let final self::Class* #t57 = c in #t57.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t57));
   let final self::Class* #t58 = c in self::Extension|get#property(#t58).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t58, 42) : null;
   self::expect(42, let final self::Class* #t59 = c in #t59.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t59));
   let final self::Class* #t60 = c in self::Extension|get#property(#t60).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t60, 87) : null;
   self::expect(42, let final self::Class* #t61 = c in #t61.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t61));
-  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t62, null);
+  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t62, null);
   self::Extension|testImplicitThis(c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
index fd2532c..4697d39 100644
--- a/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/extensions/null_aware.dart.strong.transformed.expect
@@ -56,28 +56,28 @@
   self::expect(null, tearOff.call());
   self::expect(42, let final self::Class* #t20 = c in #t20.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t21 = 42 in let final void #t22 = self::Extension|set#property(#t20, #t21) in #t21);
   self::expect(42, tearOff.call());
-  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
+  self::expect(null, let final self::Class* #t23 = c in #t23.{self::Class::==}(null) ?{Null} null : let final Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23, #t24) in #t24);
   self::expect(42, let final self::Class* #t26 = c in #t26.{self::Class::==}(null) ?{core::int*} null : let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
-  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
+  let final self::Class* #t29 = c in #t29.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t29, null);
   self::expect(null, let final self::Class* #t30 = c in #t30.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
   self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final core::int* #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31, #t33) in #t33 : #t32);
   self::expect(42, let final self::Class* #t35 = c in let final core::int* #t36 = self::Extension|get#property(#t35) in #t36.{core::num::==}(null) ?{core::int*} let final core::int* #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35, #t37) in #t37 : #t36);
-  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{core::Null?} null : let final core::Null? #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
+  self::expect(null, let final self::Class* #t39 = c in #t39.{self::Class::==}(null) ?{Null} null : let final Null #t40 = null in let final void #t41 = self::Extension|set#property(#t39, #t40) in #t40);
   let final self::Class* #t42 = c in self::Extension|get#property(#t42).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t42, 42) : null;
   self::expect(42, let final self::Class* #t43 = c in #t43.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t43));
   let final self::Class* #t44 = c in self::Extension|get#property(#t44).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t44, 87) : null;
   self::expect(42, let final self::Class* #t45 = c in #t45.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t45));
-  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t46, null);
+  let final self::Class* #t46 = c in #t46.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t46, null);
   self::expect(null, let final self::Class* #t47 = c in #t47.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t47));
   self::expect(42, let final self::Class* #t48 = c in let final core::int* #t49 = self::Extension|get#property(#t48) in #t49.{core::num::==}(null) ?{core::int*} let final core::int* #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48, #t50) in #t50 : #t49);
   self::expect(42, let final self::Class* #t52 = c in let final core::int* #t53 = self::Extension|get#property(#t52) in #t53.{core::num::==}(null) ?{core::int*} let final core::int* #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52, #t54) in #t54 : #t53);
-  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t56, null);
+  let final self::Class* #t56 = c in #t56.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t56, null);
   self::expect(null, let final self::Class* #t57 = c in #t57.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t57));
   let final self::Class* #t58 = c in self::Extension|get#property(#t58).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t58, 42) : null;
   self::expect(42, let final self::Class* #t59 = c in #t59.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t59));
   let final self::Class* #t60 = c in self::Extension|get#property(#t60).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t60, 87) : null;
   self::expect(42, let final self::Class* #t61 = c in #t61.{self::Class::==}(null) ?{core::int*} null : self::Extension|get#property(#t61));
-  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{core::Null?} null : self::Extension|set#property(#t62, null);
+  let final self::Class* #t62 = c in #t62.{self::Class::==}(null) ?{Null} null : self::Extension|set#property(#t62, null);
   self::Extension|testImplicitThis(c);
 }
 static method expect(dynamic expected, dynamic actual) → dynamic {
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
index bd5a601..49729e1 100644
--- a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
+++ b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
index bd5a601..49729e1 100644
--- a/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/assign_to_initializing_formal.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general/assign_to_initializing_formal.dart:13:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
index e224292..6e4306c 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
@@ -60,7 +60,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
index 2f10dab..1c01215 100644
--- a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -62,7 +62,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general/bug37476.dart.strong.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.strong.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
index 04597c0..09b9c11 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.outline.expect
@@ -336,16 +336,16 @@
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:32:63 -> InstanceConstant(const CustomIterable{})
 Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:33 -> ListConstant(const <String*>["Hello"])
 Evaluated: ListLiteral @ org-dartlang-testcase:///const_collections.dart:33:45 -> ListConstant(const <String*>["World"])
-Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:36:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
-Evaluated: SetConcatenation @ org-dartlang-testcase:///const_collections.dart:38:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null, "!", null]}})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:43 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///const_collections.dart:36:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///const_collections.dart:38:25 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null, "!", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:43 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:40:51 -> NullConstant(null)
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:41:42 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:44:6 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:41:42 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:44:6 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:45:12 -> InstanceConstant(const CustomIterable{})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:47:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:47:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:47:62 -> InstanceConstant(const CustomIterable{})
-Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null?>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
+Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:54 -> InstanceConstant(const _UnmodifiableSet<String*>{_UnmodifiableSet._map: const _ImmutableMap<String*, Null>{_ImmutableMap._kvPairs: const <dynamic>["hello", null, "world", null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///const_collections.dart:48:59 -> InstanceConstant(const CustomIterable{})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///const_collections.dart:49:55 -> InstanceConstant(const WithEquals{WithEquals.i: 42})
 Evaluated: MapLiteral @ org-dartlang-testcase:///const_collections.dart:53:34 -> InstanceConstant(const _ImmutableMap<String*, String*>{_ImmutableMap._kvPairs: const <dynamic>["hello", "world"]})
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
index 142a7ab..46a4481 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.expect
@@ -500,10 +500,10 @@
   #C10 = <core::String*>[#C6, #C7, #C9]
   #C11 = self::CustomIterable {}
   #C12 = <dynamic>[#C6, #C3, #C7, #C3]
-  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C13 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C12}
   #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
   #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
-  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C16 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C15}
   #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
   #C18 = <dynamic>[#C6, #C7]
   #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
@@ -512,6 +512,6 @@
   #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
   #C23 = self::CustomMap {}
   #C24 = <dynamic>[#C6, #C3]
-  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C25 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C24}
   #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
 }
diff --git a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
index 1660ee5..40a8b11 100644
--- a/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/const_collections.dart.strong.transformed.expect
@@ -505,10 +505,10 @@
   #C10 = <core::String*>[#C6, #C7, #C9]
   #C11 = self::CustomIterable {}
   #C12 = <dynamic>[#C6, #C3, #C7, #C3]
-  #C13 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C12}
+  #C13 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C12}
   #C14 = col::_UnmodifiableSet<core::String*> {_map:#C13}
   #C15 = <dynamic>[#C6, #C3, #C7, #C3, #C9, #C3]
-  #C16 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C15}
+  #C16 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C15}
   #C17 = col::_UnmodifiableSet<core::String*> {_map:#C16}
   #C18 = <dynamic>[#C6, #C7]
   #C19 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C18}
@@ -517,6 +517,6 @@
   #C22 = core::_ImmutableMap<core::String*, core::String*> {_kvPairs:#C21}
   #C23 = self::CustomMap {}
   #C24 = <dynamic>[#C6, #C3]
-  #C25 = core::_ImmutableMap<core::String*, core::Null?> {_kvPairs:#C24}
+  #C25 = core::_ImmutableMap<core::String*, Null> {_kvPairs:#C24}
   #C26 = col::_UnmodifiableSet<core::String*> {_map:#C25}
 }
diff --git a/pkg/front_end/testcases/general/constants/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
index 055199f..919d711 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.outline.expect
@@ -334,7 +334,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var;
+static field () →* Null function_var;
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = const self::ClassWithTypeArguments::•<core::int*, core::int*, core::int*>(42, 42, 42);
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = const self::ClassWithTypeArguments::•<dynamic, dynamic, dynamic>(42, 42, 42);
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
index a6df3e4..e7197ff 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.expect
@@ -562,7 +562,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var = () → core::Null? {};
+static field () →* Null function_var = () → Null {};
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
diff --git a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
index c27c932..077f295 100644
--- a/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/various.dart.strong.transformed.expect
@@ -562,7 +562,7 @@
 static const field dynamic function_const = invalid-expression "pkg/front_end/testcases/general/constants/various.dart:140:24: Error: Not a constant expression.
 const function_const = () {};
                        ^^";
-static field () →* core::Null? function_var = () → core::Null? {};
+static field () →* Null function_var = () → Null {};
 static field self::ConstClassWithFailingAssertWithEmptyMessage* failedAssertEmptyMessage = invalid-expression "This assertion failed with message: (empty)";
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments1 = #C19;
 static const field self::ClassWithTypeArguments<dynamic, dynamic, dynamic>* classWithTypeArguments2 = #C20;
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
index 4106544..7171bac 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.outline.expect
@@ -112,8 +112,8 @@
 static const field core::bool isItInt2 = self::maybeInt2 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
 static const field core::int? maybeInt3 = self::z ?{core::int?} 42 : null;
 static const field core::bool isItInt3 = self::maybeInt3 is{ForNonNullableByDefault} core::int ?{core::bool} true : false;
-static const field dynamic listOfNull = const <core::Null?>[null];
-static const field core::bool isListOfNull = self::listOfNull is{ForNonNullableByDefault} core::List<core::Null?>;
+static const field dynamic listOfNull = const <Null>[null];
+static const field core::bool isListOfNull = self::listOfNull is{ForNonNullableByDefault} core::List<Null>;
 static const field dynamic listOfInt = const <core::int>[42];
 static const field core::bool isListOfInt = self::listOfInt is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isList = self::listOfInt is{ForNonNullableByDefault} core::List<dynamic>;
@@ -180,7 +180,7 @@
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:45:40 -> BoolConstant(false)
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:46:21 -> NullConstant(null)
 Evaluated: ConditionalExpression @ org-dartlang-testcase:///various.dart:47:40 -> BoolConstant(false)
-Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:49:28 -> ListConstant(const <Null?>[null])
+Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:49:28 -> ListConstant(const <Null>[null])
 Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:50:38 -> BoolConstant(true)
 Evaluated: ListLiteral @ org-dartlang-testcase:///various.dart:51:27 -> ListConstant(const <int>[42])
 Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:52:36 -> BoolConstant(true)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
index 39c3b48..aa1a131 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.expect
@@ -223,7 +223,7 @@
   #C20 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
   #C21 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8
   #C22 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
-  #C23 = <core::Null?>[#C9]
+  #C23 = <Null>[#C9]
   #C24 = <core::int>[#C19]
   #C25 = <core::int>{#C19}
   #C26 = <core::int, core::int>{#C19:#C19)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
index 3e990c7..9d5946b 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.strong.transformed.expect
@@ -223,7 +223,7 @@
   #C20 = eval self::Foo<core::int>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
   #C21 = eval const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8
   #C22 = eval (const core::bool::fromEnvironment(#C1) ?{core::Object} #C19 : #C8) is{ForNonNullableByDefault} core::int ?{core::bool} #C8 : #C13
-  #C23 = <core::Null?>[#C9]
+  #C23 = <Null>[#C9]
   #C24 = <core::int>[#C19]
   #C25 = <core::int>{#C19}
   #C26 = <core::int, core::int>{#C19:#C19)
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
index 8a2919a..b84574b 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
@@ -1162,10 +1162,10 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
index 1b11b50..ea88d5a 100644
--- a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -1402,10 +1402,10 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
index 7c34544..48b1bf5 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
@@ -28,22 +28,22 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
index 3d30d4a..5ecd44d 100644
--- a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
@@ -28,24 +28,24 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
 
 
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
index d9a0e7e..c53238d 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
index d9a0e7e..c53238d 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_05.dart.strong.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
index a8ad767..de18361 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
index a8ad767..de18361 100644
--- a/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_locations/error_location_06.dart.strong.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
index 147592a..528c1f6 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
index 147592a..528c1f6 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_26810.dart.strong.transformed.expect
@@ -87,24 +87,24 @@
     core::print("hello ${x.{core::int::^}(y)}");
   }
   get a() → core::int*
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get b() → core::int*
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   get c() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get d() → core::int* {
-    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Null::hashCode});
+    return this.{self::Key::runtimeType}.{core::Type::hashCode}.{core::int::^}(null.{core::Object::hashCode});
   }
   get e() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get f() → core::int*
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   get g() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   get h() → core::int* {
-    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Null::hashCode}.{core::num::+}(3));
+    return 1.{core::num::+}(this.{self::Key::runtimeType}.{core::Type::hashCode}).{core::int::^}(null.{core::Object::hashCode}.{core::num::+}(3));
   }
   method i(core::int* x, core::int* y) → core::int*
     return x.{core::int::^}(y);
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
index 9325380..1c9f07b 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -51,25 +51,25 @@
   core::print(#C2);
   core::print(core::List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
   core::print(core::int*.{core::Type::toString}());
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
index 4aced3e..a1dbb58 100644
--- a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -51,25 +51,25 @@
   core::print(#C2);
   core::print(core::_List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
   core::print(core::int*.{core::Type::toString}());
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.expect b/pkg/front_end/testcases/general/functions.dart.strong.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general/functions.dart.strong.expect
+++ b/pkg/front_end/testcases/general/functions.dart.strong.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
index 9284232..cedeb06 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
index 9284232..cedeb06 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
index ad827f9..63bcf5a 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
index ad827f9..63bcf5a 100644
--- a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
index 4fd9000..5e88de7 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map;
+  field core::Map<core::String*, (core::String*) →* Null>* map;
   synthetic constructor •() → self::Class*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
index 500ccc5..cb4d5f5 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map = <core::String*, (core::String*) →* core::Null?>{"foo": (core::String* a) → core::Null? {
+  field core::Map<core::String*, (core::String*) →* Null>* map = <core::String*, (core::String*) →* Null>{"foo": (core::String* a) → Null {
     core::int* c = a.{core::String::length};
   }};
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
index 500ccc5..cb4d5f5 100644
--- a/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/infer_map_literal_with_closure.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Class extends core::Object {
-  field core::Map<core::String*, (core::String*) →* core::Null?>* map = <core::String*, (core::String*) →* core::Null?>{"foo": (core::String* a) → core::Null? {
+  field core::Map<core::String*, (core::String*) →* Null>* map = <core::String*, (core::String*) →* Null>{"foo": (core::String* a) → Null {
     core::int* c = a.{core::String::length};
   }};
   synthetic constructor •() → self::Class*
diff --git a/pkg/front_end/testcases/general/issue39344.dart.strong.expect b/pkg/front_end/testcases/general/issue39344.dart.strong.expect
index 72dd918..c0a0a59 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.strong.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
index 72dd918..c0a0a59 100644
--- a/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39344.dart.strong.transformed.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general/issue39421.dart.outline.expect b/pkg/front_end/testcases/general/issue39421.dart.outline.expect
index bda5699..7f2378b 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.outline.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.outline.expect
@@ -50,7 +50,7 @@
 class B extends core::Object {
   synthetic constructor •() → self::B*
     ;
-  method foo(core::List<core::Null?>* a) → dynamic
+  method foo(core::List<Null>* a) → dynamic
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general/issue39421.dart.strong.expect b/pkg/front_end/testcases/general/issue39421.dart.strong.expect
index 2285c0d..cb1d71a 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.strong.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
index 2285c0d..cb1d71a 100644
--- a/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39421.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general/issue39817.dart.strong.expect b/pkg/front_end/testcases/general/issue39817.dart.strong.expect
index 217fc5e..cad4f51 100644
--- a/pkg/front_end/testcases/general/issue39817.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue39817.dart.strong.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
+  Null _null;
   for (dynamic i in _null) {
   }
   ;
diff --git a/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
index da4a799..cad4f51 100644
--- a/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue39817.dart.strong.transformed.expect
@@ -1,15 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
-  {
-    core::Iterator<core::Null?>* :sync-for-iterator = _null.{core::Iterable::iterator};
-    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      dynamic i = :sync-for-iterator.{core::Iterator::current};
-      {}
-    }
+  Null _null;
+  for (dynamic i in _null) {
   }
   ;
 }
diff --git a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
index 2b93494..d7e7eca 100644
--- a/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40662.dart.strong.transformed.expect
@@ -31,7 +31,7 @@
           :async_temporary_1 = x.{core::num::+}(1);
           :async_temporary_0 = x.{core::num::+}(2);
           [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          :async_temporary_2 = <core::int*>[_in::unsafeCast<core::int*>(:async_temporary_1), _in::unsafeCast<core::int*>(:async_temporary_0), _in::unsafeCast<core::Null?>(:result)];
+          :async_temporary_2 = <core::int*>[_in::unsafeCast<core::int*>(:async_temporary_1), _in::unsafeCast<core::int*>(:async_temporary_0), _in::unsafeCast<Null>(:result)];
         }
         else {
           :async_temporary_2 = null;
diff --git a/pkg/front_end/testcases/general/issue40744.dart.strong.expect b/pkg/front_end/testcases/general/issue40744.dart.strong.expect
index fe38c65..ba04d64 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.strong.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.strong.expect
@@ -7,7 +7,7 @@
   core::print(input);
 }
 static method main() → void {
-  final core::Map<core::String*, core::Null?>* nullValueMap = core::Map::fromEntries<core::String*, core::Null?>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, core::Null?>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, core::Null?>* => new core::MapEntry::_<core::String*, core::Null?>(e.{core::MapEntry::key}, null)));
+  final core::Map<core::String*, Null>* nullValueMap = core::Map::fromEntries<core::String*, Null>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, Null>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, Null>* => new core::MapEntry::_<core::String*, Null>(e.{core::MapEntry::key}, null)));
   self::helper(nullValueMap);
 }
 
diff --git a/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
index fe38c65..ba04d64 100644
--- a/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue40744.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   core::print(input);
 }
 static method main() → void {
-  final core::Map<core::String*, core::Null?>* nullValueMap = core::Map::fromEntries<core::String*, core::Null?>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, core::Null?>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, core::Null?>* => new core::MapEntry::_<core::String*, core::Null?>(e.{core::MapEntry::key}, null)));
+  final core::Map<core::String*, Null>* nullValueMap = core::Map::fromEntries<core::String*, Null>((#C4).{core::Map::entries}.{core::Iterable::map}<core::MapEntry<core::String*, Null>*>((core::MapEntry<core::String*, dynamic>* e) → core::MapEntry<core::String*, Null>* => new core::MapEntry::_<core::String*, Null>(e.{core::MapEntry::key}, null)));
   self::helper(nullValueMap);
 }
 
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
index 1883ef1..15cb773 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.outline.expect
@@ -2,25 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/long_chain_of_typedefs.dart.strong.transformed.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
index f2faf67..3fc22fe 100644
--- a/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^" as{TypeError,ForDynamic} self::V*;
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
index 6ec0166..b651183 100644
--- a/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:41:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^";
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.outline.expect b/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
index 2768327..1172b5e 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.outline.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -29,7 +29,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,7 +71,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -127,7 +127,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -155,7 +155,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -169,7 +169,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -183,7 +183,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.strong.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.strong.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/nested_variance.dart.strong.transformed.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
index 13f8db4..bb66d2f 100644
--- a/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/no_such_method_forwarder.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          _in::unsafeCast<core::Null?>(:result);
+          _in::unsafeCast<Null>(:result);
           core::print("hello");
         }
         asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
index c69b1b3..27deb54 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
index aab1b06..4b6b1c0 100644
--- a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect b/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
index bc31717..30085d7 100644
--- a/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/regression_flutter51828.dart.strong.transformed.expect
@@ -104,10 +104,10 @@
       {
         :async_temporary_1 = new self::A::•();
         [yield] let dynamic #t1 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_1 = _in::unsafeCast<self::A*>(:async_temporary_1).{self::A::foo}(_in::unsafeCast<core::Null?>(:result));
+        :async_temporary_1 = _in::unsafeCast<self::A*>(:async_temporary_1).{self::A::foo}(_in::unsafeCast<Null>(:result));
         :async_temporary_0 = new self::B::•();
         [yield] let dynamic #t2 = asy::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = <asy::Future<void>*>[_in::unsafeCast<asy::Future<void>*>(:async_temporary_1), _in::unsafeCast<self::B*>(:async_temporary_0).{self::B::bar}(_in::unsafeCast<core::Null?>(:result))];
+        :return_value = <asy::Future<void>*>[_in::unsafeCast<asy::Future<void>*>(:async_temporary_1), _in::unsafeCast<self::B*>(:async_temporary_0).{self::B::bar}(_in::unsafeCast<Null>(:result))];
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
diff --git a/pkg/front_end/testcases/general/this_field_call.dart.strong.expect b/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
index 68c19e6..28e7d76 100644
--- a/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
+++ b/pkg/front_end/testcases/general/this_field_call.dart.strong.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
index 68c19e6..28e7d76 100644
--- a/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/this_field_call.dart.strong.transformed.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect
index 41c6dfd..e79bd82 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.outline.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class A<X extends core::Object* = dynamic> extends core::Object {
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect
index 9e640df..b21e661 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class A<X extends core::Object* = dynamic> extends core::Object {
@@ -69,13 +69,13 @@
   () →* self::A<dynamic>* source7;
   <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
   <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
-  (self::A<core::Null?>*) →* dynamic source8;
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<core::Null?>*) →* dynamic>(source8);
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void target8 = fsource8;
+  (self::A<Null>*) →* dynamic source8;
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<Null>*) →* dynamic>(source8);
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void target8 = fsource8;
   (self::A<dynamic>*) →* self::A<dynamic>* source9;
-  () →* (core::Null?) →* dynamic source10;
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (core::Null?) →* dynamic>(source10);
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void target10 = fsource10;
+  () →* (Null) →* dynamic source10;
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (Null) →* dynamic>(source10);
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void target10 = fsource10;
   ((dynamic) →* dynamic) →* dynamic source11;
   <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
   <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
@@ -105,13 +105,13 @@
   self::B<() →* self::A<dynamic>*>* source7;
   <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
   <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<(self::A<core::Null?>*) →* dynamic>* source8;
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<core::Null?>*) →* dynamic>*>(source8);
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
+  self::B<(self::A<Null>*) →* dynamic>* source8;
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<Null>*) →* dynamic>*>(source8);
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
   self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
-  self::B<() →* (core::Null?) →* dynamic>* source10;
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::B<() →* (Null) →* dynamic>* source10;
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (Null) →* dynamic>*>(source10);
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
   self::B<((dynamic) →* dynamic) →* dynamic>* source11;
   <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
   <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
diff --git a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect
index 9e640df..b21e661 100644
--- a/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/top_level_variance_test.dart.strong.transformed.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class A<X extends core::Object* = dynamic> extends core::Object {
@@ -69,13 +69,13 @@
   () →* self::A<dynamic>* source7;
   <Y extends () →* self::A<dynamic>* = dynamic>() →* void fsource7 = self::toF<() →* self::A<dynamic>*>(source7);
   <Y extends () →* self::A<dynamic>* = dynamic>() →* void target7 = fsource7;
-  (self::A<core::Null?>*) →* dynamic source8;
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<core::Null?>*) →* dynamic>(source8);
-  <Y extends (self::A<core::Null?>*) →* dynamic = dynamic>() →* void target8 = fsource8;
+  (self::A<Null>*) →* dynamic source8;
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void fsource8 = self::toF<(self::A<Null>*) →* dynamic>(source8);
+  <Y extends (self::A<Null>*) →* dynamic = dynamic>() →* void target8 = fsource8;
   (self::A<dynamic>*) →* self::A<dynamic>* source9;
-  () →* (core::Null?) →* dynamic source10;
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (core::Null?) →* dynamic>(source10);
-  <Y extends () →* (core::Null?) →* dynamic = dynamic>() →* void target10 = fsource10;
+  () →* (Null) →* dynamic source10;
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void fsource10 = self::toF<() →* (Null) →* dynamic>(source10);
+  <Y extends () →* (Null) →* dynamic = dynamic>() →* void target10 = fsource10;
   ((dynamic) →* dynamic) →* dynamic source11;
   <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void fsource11 = self::toF<((dynamic) →* dynamic) →* dynamic>(source11);
   <Y extends ((dynamic) →* dynamic) →* dynamic = dynamic>() →* void target11 = fsource11;
@@ -105,13 +105,13 @@
   self::B<() →* self::A<dynamic>*>* source7;
   <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::B<() →* self::A<dynamic>*>*>(source7);
   <Y extends self::B<() →* self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<(self::A<core::Null?>*) →* dynamic>* source8;
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<core::Null?>*) →* dynamic>*>(source8);
-  <Y extends self::B<(self::A<core::Null?>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
+  self::B<(self::A<Null>*) →* dynamic>* source8;
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void fsource8 = self::toF<self::B<(self::A<Null>*) →* dynamic>*>(source8);
+  <Y extends self::B<(self::A<Null>*) →* dynamic>* = dynamic>() →* void target8 = fsource8;
   self::B<(self::A<dynamic>*) →* self::A<dynamic>*>* source9;
-  self::B<() →* (core::Null?) →* dynamic>* source10;
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::B<() →* (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::B<() →* (Null) →* dynamic>* source10;
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::B<() →* (Null) →* dynamic>*>(source10);
+  <Y extends self::B<() →* (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
   self::B<((dynamic) →* dynamic) →* dynamic>* source11;
   <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::B<((dynamic) →* dynamic) →* dynamic>*>(source11);
   <Y extends self::B<((dynamic) →* dynamic) →* dynamic>* = dynamic>() →* void target11 = fsource11;
diff --git a/pkg/front_end/testcases/general/type_of_null.dart b/pkg/front_end/testcases/general/type_of_null.dart
index 70292a1..9e0b34b 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart
+++ b/pkg/front_end/testcases/general/type_of_null.dart
@@ -10,22 +10,22 @@
 Null foo() => null;
 
 main() {
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {},
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {},
       /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {});
-  Null Function() f = /*@ returnType=Null? */ () {};
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {});
+  Null Function() f = /*@ returnType=Null */ () {};
+  /*@ typeArgs=Null */ map(
       foo, /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(
       /*@ returnType=<BottomType> */ () => throw "hello", foo);
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {
     return null;
   }, /*@ returnType=<BottomType> */ () => throw "hello");
 
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {
     return null;
   });
-  /*@ typeArgs=() ->* Null? */ id(/*@ returnType=Null? */ () {});
+  /*@ typeArgs=() ->* Null */ id(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.outline.expect b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
index 3485e02..b7c00566 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
@@ -6,7 +6,7 @@
   ;
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   ;
-static method foo() → core::Null?
+static method foo() → Null
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
index 0aaa824..4c86065 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/annotation_variable_declaration.dart.weak.transformed.expect
@@ -35,9 +35,9 @@
     @#C1 core::String* localWithInitializer = "hello";
     @#C1 @#C2 dynamic localGroupPart1;
     @#C1 @#C2 dynamic localGroupPart2;
-    function naebdyr(@#C1 dynamic nestedFormal) → core::Null?
+    function naebdyr(@#C1 dynamic nestedFormal) → Null
       return null;
-    (dynamic) →* core::Null? roedmus = (@#C1 dynamic closureFormal) → core::Null? => null;
+    (dynamic) →* Null roedmus = (@#C1 dynamic closureFormal) → Null => null;
   }
   method hest({@#C1 dynamic named = #C3}) → dynamic
     return null;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
index 7ed1303..c916da3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart:15:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
index 7ed1303..c916da3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
   field dynamic x;
   field dynamic y;
   constructor •(dynamic x) → self::A*
-    : self::A::x = x, self::A::y = () → core::Null? {
+    : self::A::x = x, self::A::y = () → Null {
       invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/assign_to_initializing_formal.dart:15:11: Error: Can't assign to the final variable 'x'.
           x = 3;
           ^";
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
index e224292..6e4306c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.expect
@@ -60,7 +60,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
index 5d13162..34304c6 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug33099.dart.weak.transformed.expect
@@ -62,7 +62,7 @@
 static const field self::_FailingTest* failingTest = #C1;
 static method main() → dynamic {
   mir::ClassMirror* classMirror = mir::reflectClass(self::MyTest2*);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null? {
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → Null {
     if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
       core::print(memberMirror);
       core::print(self::_hasFailingTestAnnotation(memberMirror));
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
index cf2e1f7..112e0e4 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/bug37476.dart.weak.transformed.expect
@@ -8,7 +8,7 @@
     ;
   method foo() → <S extends self::A::T* = dynamic>(S*) →* void {
     core::print("foo: T = ${self::A::T*}");
-    return <S extends self::A::T* = self::A::T*>(S* a) → core::Null? {};
+    return <S extends self::A::T* = self::A::T*>(S* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
@@ -27,7 +27,7 @@
     ;
   method foo() → (self::B::T*) →* void {
     core::print("foo: T = ${self::B::T*}");
-    return (self::B::T* a) → core::Null? {};
+    return (self::B::T* a) → Null {};
   }
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
index 8adcafe..5bf2809 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/constructor_const_inference.dart.weak.transformed.expect
@@ -40,11 +40,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
index 6d7de1d..a8cfc9f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.expect
@@ -1162,10 +1162,10 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:111:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
index 0b06074..82629da 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart.weak.transformed.expect
@@ -1402,10 +1402,10 @@
   core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:111:70: Error: Expected ':' after this.
   Map<dynamic, dynamic> map11 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                                      ^": null};
-  core::Map<dynamic, core::Null?>* map12 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map12 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:112:35: Error: Expected ':' after this.
   var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
                                   ^": null};
-  core::Map<dynamic, core::Null?>* map13 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
+  core::Map<dynamic, Null>* map13 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:113:52: Error: Expected ':' after this.
   var map13 = {if (oracle(\"foo\")) \"bar\": 3.14 else 42};
                                                    ^": null};
   core::List<core::int*>* list20 = block {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
index 7c34544..48b1bf5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.expect
@@ -28,22 +28,22 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
index 5707da5..bcccf29 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/covariant_generic.dart.weak.transformed.expect
@@ -28,24 +28,24 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null? {});
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → Null {});
   fooInt.{self::Foo::method}(3);
   fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null? {});
-  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooInt.{self::Foo::withCallback}((core::int* x) → Null {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → Null {});
   fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null? {};
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → Null {};
   self::Foo<core::num*>* fooNum = fooInt;
   fooNum.{self::Foo::method}(3);
   fooNum.{self::Foo::method}(2.5);
   fooNum.{self::Foo::setter} = 3;
   fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null? {});
+  fooNum.{self::Foo::withCallback}((core::num* x) → Null {});
   fooNum.{self::Foo::mutableField} = 3;
   fooNum.{self::Foo::mutableField} = 2.5;
   let final self::Foo<core::num*>* #t1 = fooNum in let final core::int* #t2 = 3 in (#t1.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t2);
   let final self::Foo<core::num*>* #t3 = fooNum in let final core::double* #t4 = 2.5 in (#t3.{self::Foo::mutableCallbackField} as{TypeError,CovarianceCheck} (core::num*) →* void).call(#t4);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null? {};
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → Null {};
 }
 
 
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
index b2251bc..51baa0f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
index b2251bc..51baa0f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_05.dart.weak.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_05_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_05_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
index c50067b..eafc70a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
index c50067b..eafc70a 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/error_locations/error_location_06.dart.weak.transformed.expect
@@ -17,12 +17,11 @@
 //     ^
 //
 import self as self;
-import "dart:core" as core;
 
 part error_location_06_lib1.dart;
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x1(dynamic z, {dynamic z = #C1}) → dynamic {}
 static method /* from org-dartlang-testcase:///error_location_06_lib1.dart */ x2() → dynamic {
-  function y(dynamic z, {dynamic z = #C1}) → core::Null? {}
+  function y(dynamic z, {dynamic z = #C1}) → Null {}
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
index b408161..9b072b2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.expect
@@ -51,25 +51,25 @@
   core::print(#C2);
   core::print(core::List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
   core::print(core::int*.{core::Type::toString}());
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
index 3e91f0c..e1c2ce2 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/expressions.dart.weak.transformed.expect
@@ -51,25 +51,25 @@
   core::print(#C2);
   core::print(core::_List::•<core::String*>(2).{core::Object::runtimeType});
   self::foo(fisk: "Blorp gulp");
-  function f() → core::Null? {
+  function f() → Null {
     core::print("f was called");
   }
   self::caller(f);
-  self::caller(() → core::Null? {
+  self::caller(() → Null {
     core::print("<anon> was called");
   });
-  function g([dynamic message = #C1]) → core::Null? {
+  function g([dynamic message = #C1]) → Null {
     core::print(message);
   }
   g.call("Hello, World");
-  self::caller(([dynamic x = #C1]) → core::Null? {
+  self::caller(([dynamic x = #C1]) → Null {
     core::print("<anon> was called with ${x}");
   });
-  function h({dynamic message = #C1}) → core::Null? {
+  function h({dynamic message = #C1}) → Null {
     core::print(message);
   }
   h.call(message: "Hello, World");
-  self::caller(({dynamic x = #C1}) → core::Null? {
+  self::caller(({dynamic x = #C1}) → Null {
     core::print("<anon> was called with ${x}");
   });
   core::print(core::int*.{core::Type::toString}());
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
index 9279097..3e17d2c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/function_type_is_check.dart.weak.transformed.expect
@@ -14,5 +14,5 @@
     return 100;
 }
 static method main() → dynamic {
-  exp::Expect::equals(111, self::test(() → core::Null? => null).+(self::test((core::Object* o) → core::Null? => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null? => null)));
+  exp::Expect::equals(111, self::test(() → Null => null).+(self::test((core::Object* o) → Null => null)).+(self::test((core::Object* o, core::StackTrace* t) → Null => null)));
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
index f6f35ca..c10936d 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/functions.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
     f.call(a: "Hello, World");
     f.call();
   }
-  local.call(({dynamic a = #C1}) → core::Null? {
+  local.call(({dynamic a = #C1}) → Null {
     core::print(a);
   });
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
index 9a73a4f..040f77f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 import "dart:async";
 
-static get foo() → FutureOr<core::Null?>*
+static get foo() → FutureOr<Null>*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
index 9a73a4f..040f77f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/future_or_null_test.dart.weak.transformed.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 import "dart:async";
 
-static get foo() → FutureOr<core::Null?>*
+static get foo() → FutureOr<Null>*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
index 9951e94..0681005 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
index 9951e94..0681005 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <T extends core::Object* = dynamic>(T*) →* core::Null? x = let final <T extends core::Object* = dynamic>(T*) →* core::Null? f = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in f;
+  <T extends core::Object* = dynamic>(T*) →* Null x = let final <T extends core::Object* = dynamic>(T*) →* Null f = <T extends core::Object* = dynamic>(T* t) → Null {} in f;
   core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null? g = <T extends core::Object* = dynamic>(T* t) → core::Null? {} in g);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* Null g = <T extends core::Object* = dynamic>(T* t) → Null {} in g);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
index b4e24a2..215b3e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
index b4e24a2..215b3e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/illegal_named_function_expression_scope.dart.weak.transformed.expect
@@ -11,5 +11,5 @@
 
 static method main() → dynamic {
   function f() → void {}
-  core::print(let final () →* core::Null? f = () → core::Null? {} in f);
+  core::print(let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
index d10b917..7874ca5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
index d10b917..7874ca5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39344.dart.weak.transformed.expect
@@ -91,11 +91,11 @@
 static field core::List<self::B*>* xs;
 static field core::List<core::List<self::B*>*>* xss;
 static method main() → void {
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2a}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
-  self::throws(() → core::Null? {
+  self::throws(() → Null {
     new self::Class::•<self::A*>().{self::Class::method2b}(new self::B::•());
     core::print(self::xs.{core::Object::runtimeType});
   });
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
index ddd4406..c9cb480 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
index ddd4406..c9cb480 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39421.dart.weak.transformed.expect
@@ -57,7 +57,7 @@
   synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::List<core::Null?>* a) → dynamic {}
+  method foo(core::List<Null>* a) → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
index 217fc5e..cad4f51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.expect
@@ -1,9 +1,8 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
+  Null _null;
   for (dynamic i in _null) {
   }
   ;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
index da4a799..cad4f51 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue39817.dart.weak.transformed.expect
@@ -1,15 +1,9 @@
 library;
 import self as self;
-import "dart:core" as core;
 
 static method foo() → dynamic {
-  core::Null? _null;
-  {
-    core::Iterator<core::Null?>* :sync-for-iterator = _null.{core::Iterable::iterator};
-    for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
-      dynamic i = :sync-for-iterator.{core::Iterator::current};
-      {}
-    }
+  Null _null;
+  for (dynamic i in _null) {
   }
   ;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
index e62ba24..10636b1 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/long_chain_of_typedefs.dart.weak.transformed.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (core::Null?) →* void;
-typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((core::Null?) →* void) →* void;
-typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((core::Null?) →* void) →* void) →* void;
-typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((core::Null?) →* void) →* void) →* void) →* void;
-typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((core::Null?) →* void) →* void) →* void) →* void) →* void;
-typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
-typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((core::Null?) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo01<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (Null) →* void;
+typedef Foo02<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((Null) →* void) →* void;
+typedef Foo03<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((Null) →* void) →* void) →* void;
+typedef Foo04<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((Null) →* void) →* void) →* void) →* void;
+typedef Foo05<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((Null) →* void) →* void) →* void) →* void) →* void;
+typedef Foo06<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((Null) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo07<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo08<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo09<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo10<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo11<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo12<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo13<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo14<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo15<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo16<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo17<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo18<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo19<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = (((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
+typedef Foo20<unrelated X extends core::Object* = dynamic, unrelated Y extends core::Object* = dynamic, unrelated Z extends core::Object* = dynamic> = ((((((((((((((((((((Null) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void) →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
index d9e93b7..06487ac 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:49:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^" as{TypeError,ForDynamic} self::V*;
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
index ba82dfc..2f063fe 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart.weak.transformed.expect
@@ -118,14 +118,14 @@
   self::T* t;
   self::V* v;
   {
-    function T() → core::Null? {}
+    function T() → Null {}
   }
   {
     dynamic v;
   }
   {
     self::T* t;
-    () →* core::Null? x = let final () →* core::Null? T = () → core::Null? {} in T;
+    () →* Null x = let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* v;
@@ -140,9 +140,9 @@
         ^" in null;
   }
   {
-    () →* core::Null? x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
+    () →* Null x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:43:15: Error: Can't declare 'T' because it was already used in this scope.
     var x = T T() {};
-              ^" in let final () →* core::Null? T = () → core::Null? {} in T;
+              ^" in let final () →* Null T = () → Null {} in T;
   }
   {
     self::V* V = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:49:7: Error: Can't declare 'V' because it was already used in this scope.
@@ -150,9 +150,9 @@
       ^";
   }
   {
-    <T extends core::Object* = dynamic>() →* core::Null? x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
+    <T extends core::Object* = dynamic>() →* Null x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/named_function_scope.dart:54:13: Error: 'T' is already declared in this scope.
     var x = T<T>() {};
-            ^" in let final <T extends core::Object* = dynamic>() →* core::Null? T = <T extends core::Object* = dynamic>() → core::Null? {} in T;
+            ^" in let final <T extends core::Object* = dynamic>() →* Null T = <T extends core::Object* = dynamic>() → Null {} in T;
   }
   {
     self::T* t;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
index 722c19a..e1dd3c7 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/nested_variance.dart.weak.transformed.expect
@@ -10,9 +10,9 @@
 typedef FconBound<contravariant X extends core::num* = core::num*> = (X*) →* dynamic;
 typedef FinvBound<invariant X extends core::num* = core::num*> = (X*) →* X*;
 typedef FcovCyclicBound<X extends self::A<X*>* = self::A<dynamic>*> = () →* X*;
-typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<core::Null?>*> = (X*) →* dynamic;
+typedef FconCyclicBound<contravariant X extends self::A<X*>* = self::A<Null>*> = (X*) →* dynamic;
 typedef FinvCyclicBound<invariant X extends self::A<X*>* = self::A<dynamic>*> = (X*) →* X*;
-typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (core::Null?) →* dynamic> = () →* X*;
+typedef FcovCyclicCoBound<X extends (X*) →* dynamic = (Null) →* dynamic> = () →* X*;
 typedef FconCyclicCoBound<contravariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* dynamic;
 typedef FinvCyclicCoBound<invariant X extends (X*) →* dynamic = (dynamic) →* dynamic> = (X*) →* X*;
 class Acov<X extends () →* self::Acov::Y* = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Acon<X extends (self::Acon::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+class Acon<X extends (self::Acon::Y*) →* dynamic = (Null) →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
   synthetic constructor •() → self::Acon<self::Acon::X*, self::Acon::Y*>*
     : super core::Object::•()
     ;
@@ -75,7 +75,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconBound<X extends (self::AconBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
+class AconBound<X extends (self::AconBound::Y*) →* dynamic = (Null) →* dynamic, Y extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::AconBound<self::AconBound::X*, self::AconBound::Y*>*
     : super core::Object::•()
     ;
@@ -135,7 +135,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
+class AconCyclicBound<X extends (self::AconCyclicBound::Y*) →* dynamic = (Null) →* dynamic, Y extends self::A<self::AconCyclicBound::Y*>* = self::A<dynamic>*> extends core::Object {
   synthetic constructor •() → self::AconCyclicBound<self::AconCyclicBound::X*, self::AconCyclicBound::Y*>*
     : super core::Object::•()
     ;
@@ -165,7 +165,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (core::Null?) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AcovCyclicCoBound<X extends () →* self::AcovCyclicCoBound::Y* = () →* (Null) →* dynamic, Y extends (self::AcovCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AcovCyclicCoBound<self::AcovCyclicCoBound::X*, self::AcovCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -180,7 +180,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AconCyclicCoBound<X extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic, Y extends (self::AconCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AconCyclicCoBound<self::AconCyclicCoBound::X*, self::AconCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -195,7 +195,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (core::Null?) →* dynamic> extends core::Object {
+class AinvCyclicCoBound<X extends (self::AinvCyclicCoBound::Y*) →* self::AinvCyclicCoBound::Y* = ((Null) →* dynamic) →* (Null) →* dynamic, Y extends (self::AinvCyclicCoBound::Y*) →* dynamic = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::AinvCyclicCoBound<self::AinvCyclicCoBound::X*, self::AinvCyclicCoBound::Y*>*
     : super core::Object::•()
     ;
@@ -231,69 +231,69 @@
   self::Acov<() →* dynamic, dynamic>* source1;
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void fsource1 = self::toF<self::Acov<() →* dynamic, dynamic>*>(source1);
   <Y extends self::Acov<() →* dynamic, dynamic>* = dynamic>() →* void target1 = fsource1;
-  self::Acon<(core::Null?) →* dynamic, dynamic>* source2;
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(core::Null?) →* dynamic, dynamic>*>(source2);
-  <Y extends self::Acon<(core::Null?) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
+  self::Acon<(Null) →* dynamic, dynamic>* source2;
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void fsource2 = self::toF<self::Acon<(Null) →* dynamic, dynamic>*>(source2);
+  <Y extends self::Acon<(Null) →* dynamic, dynamic>* = dynamic>() →* void target2 = fsource2;
   self::Ainv<(dynamic) →* dynamic, dynamic>* source3;
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void fsource3 = self::toF<self::Ainv<(dynamic) →* dynamic, dynamic>*>(source3);
   <Y extends self::Ainv<(dynamic) →* dynamic, dynamic>* = dynamic>() →* void target3 = fsource3;
   self::AcovBound<() →* core::num*, core::num*>* source4;
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void fsource4 = self::toF<self::AcovBound<() →* core::num*, core::num*>*>(source4);
   <Y extends self::AcovBound<() →* core::num*, core::num*>* = dynamic>() →* void target4 = fsource4;
-  self::AconBound<(core::Null?) →* dynamic, core::num*>* source5;
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(core::Null?) →* dynamic, core::num*>*>(source5);
-  <Y extends self::AconBound<(core::Null?) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
+  self::AconBound<(Null) →* dynamic, core::num*>* source5;
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void fsource5 = self::toF<self::AconBound<(Null) →* dynamic, core::num*>*>(source5);
+  <Y extends self::AconBound<(Null) →* dynamic, core::num*>* = dynamic>() →* void target5 = fsource5;
   self::AinvBound<(core::num*) →* core::num*, core::num*>* source6;
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void fsource6 = self::toF<self::AinvBound<(core::num*) →* core::num*, core::num*>*>(source6);
   <Y extends self::AinvBound<(core::num*) →* core::num*, core::num*>* = dynamic>() →* void target6 = fsource6;
   self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* source7;
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void fsource7 = self::toF<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>(source7);
   <Y extends self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>* = dynamic>() →* void target7 = fsource7;
-  self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* source8;
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>(source8);
-  <Y extends self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
+  self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* source8;
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void fsource8 = self::toF<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>(source8);
+  <Y extends self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>* = dynamic>() →* void target8 = fsource8;
   self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>* source9;
-  self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source10;
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source10);
-  <Y extends self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target10 = fsource10;
-  self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* source11;
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>(source11);
-  <Y extends self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* = dynamic>() →* void target11 = fsource11;
-  self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>* source12;
+  self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* source10;
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource10 = self::toF<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>(source10);
+  <Y extends self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target10 = fsource10;
+  self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* source11;
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void fsource11 = self::toF<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>(source11);
+  <Y extends self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>* = dynamic>() →* void target11 = fsource11;
+  self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>* source12;
 }
 static method testNested() → void {
   self::B<self::Acov<() →* dynamic, dynamic>*>* source1;
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void fsource1 = self::toF<self::B<self::Acov<() →* dynamic, dynamic>*>*>(source1);
   <Y extends self::B<self::Acov<() →* dynamic, dynamic>*>* = dynamic>() →* void target1 = fsource1;
-  self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* source2;
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>*>(source2);
-  <Y extends self::B<self::Acon<(core::Null?) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
+  self::B<self::Acon<(Null) →* dynamic, dynamic>*>* source2;
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void fsource2 = self::toF<self::B<self::Acon<(Null) →* dynamic, dynamic>*>*>(source2);
+  <Y extends self::B<self::Acon<(Null) →* dynamic, dynamic>*>* = dynamic>() →* void target2 = fsource2;
   self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* source3;
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void fsource3 = self::toF<self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>*>(source3);
   <Y extends self::B<self::Ainv<(dynamic) →* dynamic, dynamic>*>* = dynamic>() →* void target3 = fsource3;
   self::B<self::AcovBound<() →* core::num*, core::num*>*>* source4;
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void fsource4 = self::toF<self::B<self::AcovBound<() →* core::num*, core::num*>*>*>(source4);
   <Y extends self::B<self::AcovBound<() →* core::num*, core::num*>*>* = dynamic>() →* void target4 = fsource4;
-  self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* source5;
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>*>(source5);
-  <Y extends self::B<self::AconBound<(core::Null?) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
+  self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* source5;
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void fsource5 = self::toF<self::B<self::AconBound<(Null) →* dynamic, core::num*>*>*>(source5);
+  <Y extends self::B<self::AconBound<(Null) →* dynamic, core::num*>*>* = dynamic>() →* void target5 = fsource5;
   self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* source6;
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void fsource6 = self::toF<self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>*>(source6);
   <Y extends self::B<self::AinvBound<(core::num*) →* core::num*, core::num*>*>* = dynamic>() →* void target6 = fsource6;
   self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* source7;
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void fsource7 = self::toF<self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>*>(source7);
   <Y extends self::B<self::AcovCyclicBound<() →* self::A<dynamic>*, self::A<dynamic>*>*>* = dynamic>() →* void target7 = fsource7;
-  self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* source8;
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>*>(source8);
-  <Y extends self::B<self::AconCyclicBound<(core::Null?) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
+  self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* source8;
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void fsource8 = self::toF<self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>*>(source8);
+  <Y extends self::B<self::AconCyclicBound<(Null) →* dynamic, self::A<dynamic>*>*>* = dynamic>() →* void target8 = fsource8;
   self::B<self::AinvCyclicBound<(self::A<dynamic>*) →* self::A<dynamic>*, self::A<dynamic>*>*>* source9;
-  self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source10;
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source10);
-  <Y extends self::B<self::AcovCyclicCoBound<() →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
-  self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source11;
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>*>(source11);
-  <Y extends self::B<self::AconCyclicCoBound<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
-  self::B<self::AinvCyclicCoBound<((core::Null?) →* dynamic) →* (core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* source12;
+  self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* source10;
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource10 = self::toF<self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>*>(source10);
+  <Y extends self::B<self::AcovCyclicCoBound<() →* (Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target10 = fsource10;
+  self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* source11;
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void fsource11 = self::toF<self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>*>(source11);
+  <Y extends self::B<self::AconCyclicCoBound<(Null) →* dynamic, (Null) →* dynamic>*>* = dynamic>() →* void target11 = fsource11;
+  self::B<self::AinvCyclicCoBound<((Null) →* dynamic) →* (Null) →* dynamic, (Null) →* dynamic>*>* source12;
 }
 static method main() → dynamic {
   self::testTypeAliasAsTypeArgument();
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
index 039d5b6..39064e3 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/non_covariant_checks.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
   generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
   constructor •(self::C::T* field1) → self::C<self::C::T*>*
-    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → core::Null? {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → core::Null? {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null? {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null? {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null? => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null? {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null? {}, super core::Object::•()
+    : self::C::field1 = field1, self::C::field2 = () → self::C::T* => field1, self::C::field3 = (self::C::T* t) → Null {}, self::C::field4 = (self::C::T* t) → self::C::T* => t, self::C::field5 = () → () →* self::C::T* => () → self::C::T* => field1, self::C::field6 = (() →* self::C::T* f) → Null {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → Null {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → Null {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → Null => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → Null {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → Null {}, super core::Object::•()
     ;
   get getter1() → self::C::T*
     return this.{self::C::field1};
@@ -318,7 +318,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter3} = (core::num* n) → core::Null? {};
+  c.{self::C::setter3} = (core::num* n) → Null {};
   try {
     c.{self::C::setter4} = (core::num* n) → core::double* => 0.5;
     throw "TypeError expected";
@@ -333,7 +333,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::setter6} = (() →* core::num* f) → core::Null? {};
+  c.{self::C::setter6} = (() →* core::num* f) → Null {};
   try {
     c.{self::C::setter7} = (() →* core::num* f) → core::double* => 0.5;
     throw "TypeError expected";
@@ -342,7 +342,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter8} = ((core::double*) →* void f) → core::Null? {};
+    c.{self::C::setter8} = ((core::double*) →* void f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -356,7 +356,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter10} = ((core::double*) →* core::num* f) → core::Null? {};
+    c.{self::C::setter10} = ((core::double*) →* core::num* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -370,14 +370,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter12} = <S extends core::num* = core::num*>() → core::Null? => null;
+    c.{self::C::setter12} = <S extends core::num* = core::num*>() → Null => null;
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → core::Null? {};
+    c.{self::C::setter13} = <S extends core::num* = core::num*>(S* s) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -391,7 +391,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → core::Null? {};
+    c.{self::C::setter15} = (<S extends core::num* = core::num*>() →* S* f) → Null {};
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -411,7 +411,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method3}((core::num* n) → core::Null? {});
+  c.{self::C::method3}((core::num* n) → Null {});
   try {
     c.{self::C::method4}((core::num* n) → core::double* => 0.5);
     throw "TypeError expected";
@@ -426,7 +426,7 @@
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
-  c.{self::C::method6}((() →* core::num* f) → core::Null? {});
+  c.{self::C::method6}((() →* core::num* f) → Null {});
   try {
     c.{self::C::method7}((() →* core::num* f) → core::double* => 0.5);
     throw "TypeError expected";
@@ -435,7 +435,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method8}(((core::double*) →* void f) → core::Null? {});
+    c.{self::C::method8}(((core::double*) →* void f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -449,7 +449,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null? {});
+    c.{self::C::method10}(((core::double*) →* core::num* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -463,14 +463,14 @@
     core::print(e);
   }
   try {
-    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null? => null);
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → Null => null);
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
     core::print(e);
   }
   try {
-    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null? {});
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
@@ -484,7 +484,7 @@
     core::print(e);
   }
   try {
-    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null? {});
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → Null {});
     throw "TypeError expected";
   }
   on core::TypeError* catch(final core::TypeError* e) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
index c69b1b3..27deb54 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
index aab1b06..4b6b1c0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/redirecting_factory_const_inference.dart.weak.transformed.expect
@@ -55,11 +55,11 @@
 }
 static method main() → dynamic {
   dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null?>*)) {
+  if(!(x is self::_Y<Null>*)) {
     throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
   }
 }
 
 constants  {
-  #C1 = self::_Y<core::Null?> {}
+  #C1 = self::_Y<Null> {}
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
index b7bd527..71a7a5b 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart
@@ -12,22 +12,22 @@
 Null foo() => null;
 
 main() {
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {},
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {},
       /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {});
-  Null Function() f = /*@ returnType=Null? */ () {};
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {});
+  Null Function() f = /*@ returnType=Null */ () {};
+  /*@ typeArgs=Null */ map(
       foo, /*@ returnType=<BottomType> */ () => throw "hello");
-  /*@ typeArgs=Null? */ map(
+  /*@ typeArgs=Null */ map(
       /*@ returnType=<BottomType> */ () => throw "hello", foo);
-  /*@ typeArgs=Null? */ map(/*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=Null */ () {
     return null;
   }, /*@ returnType=<BottomType> */ () => throw "hello");
 
-  /*@ typeArgs=Null? */ map(/*@ returnType=<BottomType> */ () => throw "hello",
-      /*@ returnType=Null? */ () {
+  /*@ typeArgs=Null */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null */ () {
     return null;
   });
-  /*@ typeArgs=() ->* Null? */ id(/*@ returnType=Null? */ () {});
+  /*@ typeArgs=() ->* Null */ id(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
index c0c8997..335ccc5 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/type_of_null.dart.weak.transformed.expect
@@ -5,21 +5,21 @@
 static method map<T extends core::Object* = dynamic>(() →* self::map::T* f1, () →* self::map::T* f2) → self::map::T* {}
 static method id<T extends core::Object* = dynamic>(self::id::T* t) → dynamic
   return t;
-static method foo() → core::Null?
+static method foo() → Null
   return null;
 static method main() → dynamic {
-  self::map<core::Null?>(() → core::Null? {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {});
-  () →* core::Null? f = () → core::Null? {};
-  self::map<core::Null?>(#C1, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", #C1);
-  self::map<core::Null?>(() → core::Null? {
+  self::map<Null>(() → Null {}, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {});
+  () →* Null f = () → Null {};
+  self::map<Null>(#C1, () → <BottomType>=> throw "hello");
+  self::map<Null>(() → <BottomType>=> throw "hello", #C1);
+  self::map<Null>(() → Null {
     return null;
   }, () → <BottomType>=> throw "hello");
-  self::map<core::Null?>(() → <BottomType>=> throw "hello", () → core::Null? {
+  self::map<Null>(() → <BottomType>=> throw "hello", () → Null {
     return null;
   });
-  self::id<() →* core::Null?>(() → core::Null? {});
+  self::id<() →* Null>(() → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
index 3d44037..3c9883b 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
index 3d44037..3c9883b 100644
--- a/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/implicit_getter_calls/this_field_call.dart.strong.transformed.expect
@@ -21,5 +21,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  new self::A::•<core::int*>((core::int* x) → core::Null? {}).{self::A::foo}(3);
+  new self::A::•<core::int*>((core::int* x) → Null {}).{self::A::foo}(3);
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
index 69c221d..98a923f 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.1.expect
@@ -18,9 +18,9 @@
   #C2 = null
   #C3 = "world"
   #C4 = <dynamic>[#C1, #C2, #C3, #C2]
-  #C5 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C4}
+  #C5 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C4}
   #C6 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C5}
   #C7 = <dynamic>[]
-  #C8 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C7}
+  #C8 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C7}
   #C9 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C8}
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
index 3689646..3e1ca84 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/constant_set_literal.yaml.world.2.expect
@@ -17,9 +17,9 @@
   #C1 = 42
   #C2 = null
   #C3 = <dynamic>[#C1, #C2]
-  #C4 = dart.core::_ImmutableMap<dart.core::int*, dart.core::Null?> {_kvPairs:#C3}
+  #C4 = dart.core::_ImmutableMap<dart.core::int*, Null> {_kvPairs:#C3}
   #C5 = dart.collection::_UnmodifiableSet<dart.core::int*> {_map:#C4}
   #C6 = <dynamic>[]
-  #C7 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Null?> {_kvPairs:#C6}
+  #C7 = dart.core::_ImmutableMap<dart.core::String*, Null> {_kvPairs:#C6}
   #C8 = dart.collection::_UnmodifiableSet<dart.core::String*> {_map:#C7}
 }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
index 7c5af72..32da763 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.1.expect
@@ -16,7 +16,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L1;
         }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
index 4b0f955..0fabe89 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_3.yaml.world.2.expect
@@ -16,7 +16,7 @@
         #L1:
         {
           [yield] let dynamic #t1 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L1;
         }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
index 692ae81..e8c7c9a 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.1.expect
@@ -65,7 +65,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello";
           break #L2;
         }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
index 884a62e..af9c5da 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.2.expect
@@ -65,7 +65,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello!!!";
           break #L2;
         }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
index 5287c01..abf2025 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_5.yaml.world.3.expect
@@ -66,7 +66,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = dart.async::_awaitHelper(null, :async_op_then, :async_op_error, :async_op) in null;
-          dart._internal::unsafeCast<dart.core::Null?>(:result);
+          dart._internal::unsafeCast<Null>(:result);
           :return_value = "hello!!!";
           break #L2;
         }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
index 9cd7e48..fab0774 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/reissue_errors_6.yaml.world.3.expect
@@ -3,7 +3,7 @@
 
   import "org-dartlang-test:///main.dart";
 
-  class Bar<X extends main::Foo<dart.core::Null?>* = main::Foo<dart.core::Null?>*> extends dart.core::Object {
+  class Bar<X extends main::Foo<Null>* = main::Foo<Null>*> extends dart.core::Object {
     synthetic constructor •() → lib::Bar<lib::Bar::X*>*
       : super dart.core::Object::•()
       ;
@@ -23,7 +23,7 @@
 
   import "org-dartlang-test:///lib.dart";
 
-  class Foo<X extends lib::Bar<main::Foo<dart.core::Null?>*>* = lib::Bar<main::Foo<dart.core::Null?>*>*> extends dart.core::Object {
+  class Foo<X extends lib::Bar<main::Foo<Null>*>* = lib::Bar<main::Foo<Null>*>*> extends dart.core::Object {
     synthetic constructor •() → main::Foo<main::Foo::X*>*
       : super dart.core::Object::•()
       ;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
index 5e47a90..b40afa5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@ type=() ->* Future<Null?>* */ f = /*@ returnType=Future<Null?>* */ () async {
+  var /*@ type=() ->* Future<Null>* */ f = /*@ returnType=Future<Null>* */ () async {
     return null;
   };
   Future y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
index e0504e6..1b41da7 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
@@ -6,7 +6,7 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () →* asy::Future<core::Null?>* f = () → asy::Future<core::Null?>* async {
+  () →* asy::Future<Null>* f = () → asy::Future<Null>* async {
     return null;
   };
   asy::Future<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index 1bde8d4..6215f3a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -20,10 +20,10 @@
     try {
       #L1:
       {
-        () →* asy::Future<core::Null?>* f = () → asy::Future<core::Null?>* /* originally async */ {
-          final asy::_Future<core::Null?>* :async_future = new asy::_Future::•<core::Null?>();
+        () →* asy::Future<Null>* f = () → asy::Future<Null>* /* originally async */ {
+          final asy::_Future<Null>* :async_future = new asy::_Future::•<Null>();
           core::bool* :is_sync = false;
-          FutureOr<core::Null?>* :return_value;
+          FutureOr<Null>* :return_value;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
           (core::Object*, core::StackTrace*) →* dynamic :async_op_error;
@@ -52,7 +52,7 @@
         asy::Future<dynamic>* y = f.call();
         asy::Future<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String* s = _in::unsafeCast<core::Null?>(:result);
+        core::String* s = _in::unsafeCast<Null>(:result);
       }
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
index 1eabccf..440f561 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@ type=() ->* Stream<Null?>* */ f = /*@ returnType=Stream<Null?>* */ () async* {
+  var /*@ type=() ->* Stream<Null>* */ f = /*@ returnType=Stream<Null>* */ () async* {
     yield null;
   };
   Stream y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
index 3bfdf39..4f2a9bc 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
@@ -6,7 +6,7 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () →* asy::Stream<core::Null?>* f = () → asy::Stream<core::Null?>* async* {
+  () →* asy::Stream<Null>* f = () → asy::Stream<Null>* async* {
     yield null;
   };
   asy::Stream<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index c83accd..a83d5ab 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -20,8 +20,8 @@
     try {
       #L1:
       {
-        () →* asy::Stream<core::Null?>* f = () → asy::Stream<core::Null?>* /* originally async* */ {
-          asy::_AsyncStarStreamController<core::Null?>* :controller;
+        () →* asy::Stream<Null>* f = () → asy::Stream<Null>* /* originally async* */ {
+          asy::_AsyncStarStreamController<Null>* :controller;
           dynamic :controller_stream;
           dynamic :async_stack_trace;
           (dynamic) →* dynamic :async_op_then;
@@ -51,14 +51,14 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :controller = new asy::_AsyncStarStreamController::•<core::Null?>(:async_op);
+          :controller = new asy::_AsyncStarStreamController::•<Null>(:async_op);
           :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
           return :controller_stream;
         };
         asy::Stream<dynamic>* y = f.call();
         asy::Stream<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
-        core::String* s = _in::unsafeCast<core::Null?>(:result);
+        core::String* s = _in::unsafeCast<Null>(:result);
       }
       asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
index ff64ba7..4c33394 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
@@ -9,18 +9,18 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@ type=(Object*) ->* Null? */ f = /*@ returnType=Null? */ (Object x) {
+  var /*@ type=(Object*) ->* Null */ f = /*@ returnType=Null */ (Object x) {
     return null;
   };
   String y = f(42);
 
-  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null? */ (/*@ type=Object* */ x) =>
+  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null */ (/*@ type=Object* */ x) =>
       'hello';
 
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) {
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) {
     return null;
   });
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) {
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
index c1bf65f..cdf3f6a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? {
+  (core::Object*) →* Null f = (core::Object* x) → Null {
     return null;
   };
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
-  self::foo((core::Object* x) → core::Null? {
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  self::foo((core::Object* x) → Null {
     return null;
   });
-  self::foo((core::Object* x) → core::Null? {
+  self::foo((core::Object* x) → Null {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
index c1bf65f..cdf3f6a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? {
+  (core::Object*) →* Null f = (core::Object* x) → Null {
     return null;
   };
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
-  self::foo((core::Object* x) → core::Null? {
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
+  self::foo((core::Object* x) → Null {
     return null;
   });
-  self::foo((core::Object* x) → core::Null? {
+  self::foo((core::Object* x) → Null {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
index 6d0a4af..c774479 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
@@ -6,7 +6,7 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Iterable<Null?>* */ f = /*@ returnType=Iterable<Null?>* */ () sync* {
+  var /*@ type=() ->* Iterable<Null>* */ f = /*@ returnType=Iterable<Null>* */ () sync* {
     yield null;
   };
   Iterable y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
index 96ec582..58702d6 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Iterable<core::Null?>* f = () → core::Iterable<core::Null?>* sync* {
+  () →* core::Iterable<Null>* f = () → core::Iterable<Null>* sync* {
     yield null;
   };
   core::Iterable<dynamic>* y = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
index ad5d5f0..a73b655 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Iterable<core::Null?>* f = () → core::Iterable<core::Null?>* /* originally sync* */ {
+  () →* core::Iterable<Null>* f = () → core::Iterable<Null>* /* originally sync* */ {
     function :sync_op_gen() → (core::_SyncIterator<dynamic>*, dynamic, dynamic) →* core::bool* {
       core::int* :await_jump_var = 0;
       dynamic :await_ctx_var;
@@ -18,7 +18,7 @@
       }
       return :sync_op;
     }
-    return new core::_SyncIterable::•<core::Null?>(:sync_op_gen);
+    return new core::_SyncIterable::•<Null>(:sync_op_gen);
   };
   core::Iterable<dynamic>* y = f.call();
   core::Iterable<core::String*>* z = f.call();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
index 0c6ada5..531bf49 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
@@ -7,9 +7,9 @@
 
 test1() {
   List<int> o;
-  var /*@ type=Iterable<Null?>* */ y =
-      o. /*@ typeArgs=Null? */ /*@target=Iterable.map*/ map(
-          /*@ returnType=Null? */ (/*@ type=int* */ x) {});
+  var /*@ type=Iterable<Null>* */ y =
+      o. /*@ typeArgs=Null */ /*@target=Iterable.map*/ map(
+          /*@ returnType=Null */ (/*@ type=int* */ x) {});
   Iterable<int> z = y;
 }
 
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
index ae81c76..6a55e9b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::List<core::int*>* o;
-  core::Iterable<core::Null?>* y = o.{core::Iterable::map}<core::Null?>((core::int* x) → core::Null? {});
+  core::Iterable<Null>* y = o.{core::Iterable::map}<Null>((core::int* x) → Null {});
   core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
index ae81c76..6a55e9b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test1() → dynamic {
   core::List<core::int*>* o;
-  core::Iterable<core::Null?>* y = o.{core::Iterable::map}<core::Null?>((core::int* x) → core::Null? {});
+  core::Iterable<Null>* y = o.{core::Iterable::map}<Null>((core::int* x) → Null {});
   core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
index 30d096e..86e4e26 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
@@ -6,24 +6,24 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Null? */ a = /*@ returnType=Null? */ () {};
-  var /*@ type=() ->* Null? */ b = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ a = /*@ returnType=Null */ () {};
+  var /*@ type=() ->* Null */ b = /*@ returnType=Null */ () {
     return;
   };
-  var /*@ type=() ->* Null? */ c = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ c = /*@ returnType=Null */ () {
     return null;
   };
   var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@ type=(bool*) ->* Null? */ e = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ e = /*@ returnType=Null */ (bool b) {
     if (b) {
       return;
     } else {
       return;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ f = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ f = /*@ returnType=Null */ (bool b) {
     if (b) {
       return;
     } else {
@@ -37,14 +37,14 @@
       return 0;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ h = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ h = /*@ returnType=Null */ (bool b) {
     if (b) {
       return null;
     } else {
       return;
     }
   };
-  var /*@ type=(bool*) ->* Null? */ i = /*@ returnType=Null? */ (bool b) {
+  var /*@ type=(bool*) ->* Null */ i = /*@ returnType=Null */ (bool b) {
     if (b) {
       return null;
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
index 3ccb306..39b321c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? a = () → core::Null? {};
-  () →* core::Null? b = () → core::Null? {
+  () →* Null a = () → Null {};
+  () →* Null b = () → Null {
     return;
   };
-  () →* core::Null? c = () → core::Null? {
+  () →* Null c = () → Null {
     return null;
   };
   () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool*) →* core::Null? e = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null e = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? f = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null f = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool*) →* core::Null? h = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null h = (core::bool* b) → Null {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? i = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null i = (core::bool* b) → Null {
     if(b) {
       return null;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
index 3ccb306..39b321c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? a = () → core::Null? {};
-  () →* core::Null? b = () → core::Null? {
+  () →* Null a = () → Null {};
+  () →* Null b = () → Null {
     return;
   };
-  () →* core::Null? c = () → core::Null? {
+  () →* Null c = () → Null {
     return null;
   };
   () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool*) →* core::Null? e = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null e = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? f = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null f = (core::bool* b) → Null {
     if(b) {
       return;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool*) →* core::Null? h = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null h = (core::bool* b) → Null {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool*) →* core::Null? i = (core::bool* b) → core::Null? {
+  (core::bool*) →* Null i = (core::bool* b) → Null {
     if(b) {
       return null;
     }
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart b/pkg/front_end/testcases/inference/bottom_in_closure.dart
index b05f476..9084f25 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var v = /*@ returnType=Null? */ () => null;
+var v = /*@ returnType=Null */ () => null;
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
index 0eb1af7..9f65784 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.outline.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v;
+static field () →* Null v;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
index 8325cbb..63cbd26 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
@@ -1,8 +1,7 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v = () → core::Null? => null;
+static field () →* Null v = () → Null => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
index 8325cbb..63cbd26 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
@@ -1,8 +1,7 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
-static field () →* core::Null? v = () → core::Null? => null;
+static field () →* Null v = () → Null => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
index e4b0faf..1937cae 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null?) →* core::int* f = (core::Object* x) → core::int* => 1;
+  (Null) →* core::int* f = (core::Object* x) → core::int* => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
index e4b0faf..1937cae 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null?) →* core::int* f = (core::Object* x) → core::int* => 1;
+  (Null) →* core::int* f = (core::Object* x) → core::int* => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
index da3d184..03c50b9 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
@@ -10,13 +10,13 @@
   var /*@ type=dynamic */ b = null;
   var /*@ type=dynamic */ c = throw 'foo';
   var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () => 0;
-  var /*@ type=() ->* Null? */ e = /*@ returnType=Null? */ () => null;
+  var /*@ type=() ->* Null */ e = /*@ returnType=Null */ () => null;
   var /*@ type=() ->* <BottomType> */ f = /*@ returnType=<BottomType> */ () =>
       throw 'foo';
   var /*@ type=() ->* int* */ g = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@ type=() ->* Null? */ h = /*@ returnType=Null? */ () {
+  var /*@ type=() ->* Null */ h = /*@ returnType=Null */ () {
     return null;
   };
   var /*@ type=() ->* <BottomType> */ i = /*@ returnType=<BottomType> */ () {
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
index 6d3a4af..6dd3514 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
@@ -7,12 +7,12 @@
   dynamic b = null;
   dynamic c = throw "foo";
   () →* core::int* d = () → core::int* => 0;
-  () →* core::Null? e = () → core::Null? => null;
+  () →* Null e = () → Null => null;
   () →* <BottomType>f = () → <BottomType>=> throw "foo";
   () →* core::int* g = () → core::int* {
     return 0;
   };
-  () →* core::Null? h = () → core::Null? {
+  () →* Null h = () → Null {
     return null;
   };
   () →* <BottomType>i = () → <BottomType>{
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
index 6d3a4af..6dd3514 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
@@ -7,12 +7,12 @@
   dynamic b = null;
   dynamic c = throw "foo";
   () →* core::int* d = () → core::int* => 0;
-  () →* core::Null? e = () → core::Null? => null;
+  () →* Null e = () → Null => null;
   () →* <BottomType>f = () → <BottomType>=> throw "foo";
   () →* core::int* g = () → core::int* {
     return 0;
   };
-  () →* core::Null? h = () → core::Null? {
+  () →* Null h = () → Null {
     return null;
   };
   () →* <BottomType>i = () → <BottomType>{
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
index 1d09fe8..fef6699 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
@@ -11,7 +11,7 @@
 
 void test() {
   void f(@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */ x) {}
-  var /*@ type=(dynamic) ->* Null? */ x = /*@ returnType=Null? */ (@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */
+  var /*@ type=(dynamic) ->* Null */ x = /*@ returnType=Null */ (@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */
       x) {};
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
index 3dff8eb..2bd8ed8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f(@#C1 dynamic x) → void {}
-  (dynamic) →* core::Null? x = (@#C1 dynamic x) → core::Null? {};
+  (dynamic) →* Null x = (@#C1 dynamic x) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
index 3dff8eb..2bd8ed8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f(@#C1 dynamic x) → void {}
-  (dynamic) →* core::Null? x = (@#C1 dynamic x) → core::Null? {};
+  (dynamic) →* Null x = (@#C1 dynamic x) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
index a81e330..011f07f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
@@ -11,8 +11,8 @@
 
 void test() {
   void f<@Foo(/*@ typeArgs=String* */ const []) T>() {}
-  var /*@ type=<T extends Object* = dynamic>() ->* Null? */ x =
-      <@Foo(/*@ typeArgs=String* */ const []) T> /*@ returnType=Null? */ () {};
+  var /*@ type=<T extends Object* = dynamic>() ->* Null */ x =
+      <@Foo(/*@ typeArgs=String* */ const []) T> /*@ returnType=Null */ () {};
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
index f4ed260..ebb93a8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f<@#C1 T extends core::Object* = dynamic>() → void {}
-  <T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
+  <T extends core::Object* = dynamic>() →* Null x = <@#C1 T extends core::Object* = dynamic>() → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
index f4ed260..ebb93a8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method test() → void {
   function f<@#C1 T extends core::Object* = dynamic>() → void {}
-  <T extends core::Object* = dynamic>() →* core::Null? x = <@#C1 T extends core::Object* = dynamic>() → core::Null? {};
+  <T extends core::Object* = dynamic>() →* Null x = <@#C1 T extends core::Object* = dynamic>() → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
index 2085ac4..4f6fc11 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
@@ -9,7 +9,7 @@
 
 void test() {
   {
-    Function2<int, String> l0 = /*@ returnType=Null? */ (int x) => null;
+    Function2<int, String> l0 = /*@ returnType=Null */ (int x) => null;
     Function2<int, String> l1 = /*@ returnType=String* */ (int x) => "hello";
     Function2<int, String>
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -21,7 +21,7 @@
     };
   }
   {
-    Function2<int, String> l0 = /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
+    Function2<int, String> l0 = /*@ returnType=Null */ (/*@ type=int* */ x) => null;
     Function2<int, String> l1 = /*@ returnType=String* */ (/*@ type=int* */ x) =>
         "hello";
     Function2<int, String>
@@ -35,7 +35,7 @@
     };
   }
   {
-    Function2<int, List<String>> l0 = /*@ returnType=Null? */ (int x) => null;
+    Function2<int, List<String>> l0 = /*@ returnType=Null */ (int x) => null;
     Function2<int, List<String>> l1 = /*@ returnType=List<String*>* */ (int
         x) => /*@ typeArgs=String* */ ["hello"];
     Function2<int, List<String>>
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 55385e0..edd0868 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -54,7 +54,7 @@
 typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -69,7 +69,7 @@
     };
   }
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
             3;
@@ -86,7 +86,7 @@
     };
   }
   {
-    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     (core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index 46f24ee..4e084a6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -54,7 +54,7 @@
 typedef Function2<contravariant S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:69: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
@@ -69,7 +69,7 @@
     };
   }
   {
-    (core::int*) →* core::String* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::String* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
     (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:29:13: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
             3;
@@ -86,7 +86,7 @@
     };
   }
   {
-    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::Null? => null;
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → Null => null;
     (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     (core::int*) →* core::List<core::String*>* l2 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:76: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
index 557c38e..11313d5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
@@ -9,7 +9,7 @@
   {
     String f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
-    v = <T> /*@ returnType=Null? */ (int x) => null;
+    v = <T> /*@ returnType=Null */ (int x) => null;
     v = <T> /*@ returnType=String* */ (int x) => "hello";
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
         "hello";
@@ -21,7 +21,7 @@
   {
     String f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
-    v = <T> /*@ returnType=Null? */ (/*@ type=int* */ x) => null;
+    v = <T> /*@ returnType=Null */ (/*@ type=int* */ x) => null;
     v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
     v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
             T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
@@ -36,7 +36,7 @@
   {
     List<String> f<S>(int x) => null;
     var /*@ type=<S extends Object* = dynamic>(int*) ->* List<String*>* */ v = f;
-    v = <T> /*@ returnType=Null? */ (int x) => null;
+    v = <T> /*@ returnType=Null */ (int x) => null;
     v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
           "hello"
         ];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index ee90542..b3f94c4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -56,7 +56,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
@@ -74,7 +74,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
         3;
@@ -94,7 +94,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index dfcc1ab..5fa06c8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -56,7 +56,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:68: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
@@ -74,7 +74,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
     v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:28:9: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
         3;
@@ -94,7 +94,7 @@
     function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
-    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null? => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → Null => null;
     v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
     v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:75: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
  - 'List' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
index ecf97aa..93827b6 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
@@ -13,7 +13,7 @@
       . /*@ typeArgs=List<dynamic>* */ /*@target=Future.then*/ then(
           /*@ returnType=List<dynamic>* */ (/*@ type=int* */ x) => /*@ typeArgs=dynamic */ [])
       . /*@target=Future.whenComplete*/ whenComplete(
-          /*@ returnType=Null? */ () {});
+          /*@ returnType=Null */ () {});
   b = f. /*@ typeArgs=List<int*>* */ /*@target=Future.then*/ then(
       /*@ returnType=List<int*>* */ (/*@ type=int* */ x) => /*@ typeArgs=int* */ []);
 }
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
index e129de8..fb4af0a 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
@@ -7,7 +7,7 @@
 
 static method test() → dynamic {
   asy::Future<core::int*>* f;
-  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → core::Null? {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
+  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → Null {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
   b = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
index e129de8..fb4af0a 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
 
 static method test() → dynamic {
   asy::Future<core::int*>* f;
-  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → core::Null? {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
+  asy::Future<core::List<core::int*>*>* b = f.{asy::Future::then}<core::List<dynamic>*>((core::int* x) → core::List<dynamic>* => <dynamic>[]).{asy::Future::whenComplete}(() → Null {}) as{TypeError} asy::Future<core::List<core::int*>*>*;
   b = f.{asy::Future::then}<core::List<core::int*>*>((core::int* x) → core::List<core::int*>* => <core::int*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
index 34aede8..a68f5bd 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
@@ -12,6 +12,6 @@
 
 main() {
   var /*@ type=(num*) ->* List<int*>* */ v = /*@ typeArgs=(num*) ->* List<int*>* */ generic(
-      /*@ returnType=Null? */ (F f) => null,
-      /*@ returnType=Null? */ (G g) => null);
+      /*@ returnType=Null */ (F f) => null,
+      /*@ returnType=Null */ (G g) => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
index 4a105fb..868f419 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
@@ -7,5 +7,5 @@
 static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
   return null;
 static method main() → dynamic {
-  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null? => null, ((core::double*) →* core::List<core::int*>* g) → core::Null? => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → Null => null, ((core::double*) →* core::List<core::int*>* g) → Null => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
index 4a105fb..868f419 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
@@ -7,5 +7,5 @@
 static method generic<T extends core::Object* = dynamic>((self::generic::T*) →* dynamic a, (self::generic::T*) →* dynamic b) → self::generic::T*
   return null;
 static method main() → dynamic {
-  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null? => null, ((core::double*) →* core::List<core::int*>* g) → core::Null? => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → Null => null, ((core::double*) →* core::List<core::int*>* g) → Null => null);
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
index f1fd89e..23dc5b6 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
@@ -6,5 +6,5 @@
 library test;
 
 main() {
-  var /*@ type=() ->* Null? */ f = /*@ returnType=Null? */ () {};
+  var /*@ type=() ->* Null */ f = /*@ returnType=Null */ () {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
index 64040c7..8ee4d33 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? f = () → core::Null? {};
+  () →* Null f = () → Null {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
index 64040c7..8ee4d33 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
@@ -1,7 +1,6 @@
 library test;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  () →* core::Null? f = () → core::Null? {};
+  () →* Null f = () → Null {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
index 0d24e42..ffe8964 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
@@ -10,5 +10,5 @@
 }
 
 main() {
-  var /*@ type=C* */ c = new C(/*@ returnType=Null? */ () {});
+  var /*@ type=C* */ c = new C(/*@ returnType=Null */ () {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
index 9bda853..21efe4c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
@@ -17,5 +17,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::C* c = new self::C::•(() → core::Null? {});
+  self::C* c = new self::C::•(() → Null {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
index 9bda853..21efe4c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
@@ -17,5 +17,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::C* c = new self::C::•(() → core::Null? {});
+  self::C* c = new self::C::•(() → Null {});
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
index d4a8217..c332b1a 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> {
-  void Function(T) f<U>(U x) => /*@ returnType=Null? */ (/*@ type=C::T* */ y) {};
+  void Function(T) f<U>(U x) => /*@ returnType=Null */ (/*@ type=C::T* */ y) {};
 }
 
 void test(C<String> c) {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index dcd0fc2..eb193d3 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
-    return (self::C::T* y) → core::Null? {};
+    return (self::C::T* y) → Null {};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index dcd0fc2..eb193d3 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
-    return (self::C::T* y) → core::Null? {};
+    return (self::C::T* y) → Null {};
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
index 405c751..5358324 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@ type=List<Null?>* */ x = /*@ typeArgs=Null? */ [null];
+  var /*@ type=List<Null>* */ x = /*@ typeArgs=Null */ [null];
   x. /*@target=List.add*/ add(/*error:INVALID_CAST_LITERAL*/ 42);
 }
 
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
index dafc04b..56e22ce 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null?>* x = <core::Null?>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null?);
+  core::List<Null>* x = <Null>[null];
+  x.{core::List::add}(42 as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
index dafc04b..56e22ce 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null?>* x = <core::Null?>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null?);
+  core::List<Null>* x = <Null>[null];
+  x.{core::List::add}(42 as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
index 744f9e2..e98f54e 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@ type=Map<Null?, Null?>* */ x = /*@ typeArgs=Null?, Null? */ {null: null};
+  var /*@ type=Map<Null, Null>* */ x = /*@ typeArgs=Null, Null */ {null: null};
   x /*@target=Map.[]=*/ [
       /*error:INVALID_CAST_LITERAL*/ 3] = /*error:INVALID_CAST_LITERAL*/ 'z';
 }
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
index 38d6f76..a14b93f 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null?, "z" as{TypeError} core::Null?);
+  core::Map<Null, Null>* x = <Null, Null>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} Null, "z" as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
index 38d6f76..a14b93f 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null?, "z" as{TypeError} core::Null?);
+  core::Map<Null, Null>* x = <Null, Null>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} Null, "z" as{TypeError} Null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
index 42550db..4ee6f9f 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
@@ -9,10 +9,10 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@ type=(Object*) ->* Null? */ f = /*@ returnType=Null? */ (Object x) => null;
+  var /*@ type=(Object*) ->* Null */ f = /*@ returnType=Null */ (Object x) => null;
   String y = /*info:DYNAMIC_CAST*/ f(42);
 
-  f = /*@ returnType=Null? */ (/*@ type=Object* */ x) => 'hello';
+  f = /*@ returnType=Null */ (/*@ type=Object* */ x) => 'hello';
 
   var /*@ type=dynamic */ g = null;
   g = 'hello';
@@ -21,7 +21,7 @@
   h = 'hello';
   (/*info:DYNAMIC_INVOKE*/ h.foo());
 
-  foo(/*@ returnType=Null? */ (/*@ type=Object* */ x) => null);
+  foo(/*@ returnType=Null */ (/*@ type=Object* */ x) => null);
   foo(/*@ returnType=<BottomType> */ (/*@ type=Object* */ x) =>
       throw "not implemented");
 }
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
index 20b5208..adf4727 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? => null;
+  (core::Object*) →* Null f = (core::Object* x) → Null => null;
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object* x) → core::Null? => null);
+  self::foo((core::Object* x) → Null => null);
   self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
index 20b5208..adf4727 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 static field dynamic h = null;
 static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object*) →* core::Null? f = (core::Object* x) → core::Null? => null;
+  (core::Object*) →* Null f = (core::Object* x) → Null => null;
   core::String* y = f.call(42);
-  f = (core::Object* x) → core::Null? => "hello" as{TypeError} core::Null?;
+  f = (core::Object* x) → Null => "hello" as{TypeError} Null;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object* x) → core::Null? => null);
+  self::foo((core::Object* x) → Null => null);
   self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
index f4c4777..cf84f5e 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -6,7 +6,7 @@
   synthetic constructor •() → self::NullEquality*
     ;
   @core::override
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
index 6ebf410..6f3dcc4 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   @#C1
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
index 6ebf410..6f3dcc4 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
   @#C1
-  operator ==(core::Object* other) → core::Null?
+  operator ==(core::Object* other) → Null
     return null;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
index b0671b2..0cfa3ae 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
@@ -12,8 +12,8 @@
 main() {
   void optional_local([List<int> x = /*@ typeArgs=int* */ const []]) {}
   void named_local({List<int> x: /*@ typeArgs=int* */ const []}) {}
-  var /*@ type=([List<int*>*]) ->* Null? */ optional_closure = /*@ returnType=Null? */ (
+  var /*@ type=([List<int*>*]) ->* Null */ optional_closure = /*@ returnType=Null */ (
       [List<int> x = /*@ typeArgs=int* */ const []]) {};
-  var /*@ type=({x: List<int*>*}) ->* Null? */ name_closure = /*@ returnType=Null? */ (
+  var /*@ type=({x: List<int*>*}) ->* Null */ name_closure = /*@ returnType=Null */ (
       {List<int> x: /*@ typeArgs=int* */ const []}) {};
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
index 0c97dce..b20f8c7 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
@@ -7,8 +7,8 @@
 static method main() → dynamic {
   function optional_local([core::List<core::int*>* x = #C1]) → void {}
   function named_local({core::List<core::int*>* x = #C1}) → void {}
-  ([core::List<core::int*>*]) →* core::Null? optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null? {};
-  ({x: core::List<core::int*>*}) →* core::Null? name_closure = ({core::List<core::int*>* x = #C1}) → core::Null? {};
+  ([core::List<core::int*>*]) →* Null optional_closure = ([core::List<core::int*>* x = #C1]) → Null {};
+  ({x: core::List<core::int*>*}) →* Null name_closure = ({core::List<core::int*>* x = #C1}) → Null {};
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
index 0c97dce..b20f8c7 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
@@ -7,8 +7,8 @@
 static method main() → dynamic {
   function optional_local([core::List<core::int*>* x = #C1]) → void {}
   function named_local({core::List<core::int*>* x = #C1}) → void {}
-  ([core::List<core::int*>*]) →* core::Null? optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null? {};
-  ({x: core::List<core::int*>*}) →* core::Null? name_closure = ({core::List<core::int*>* x = #C1}) → core::Null? {};
+  ([core::List<core::int*>*]) →* Null optional_closure = ([core::List<core::int*>* x = #C1]) → Null {};
+  ({x: core::List<core::int*>*}) →* Null name_closure = ({core::List<core::int*>* x = #C1}) → Null {};
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
index ce97e95..ece9a42 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
@@ -26,9 +26,9 @@
   var /*@ type=C<dynamic>* */ c_named_local =
       new /*@ typeArgs=dynamic */ C.named(named_local);
   var /*@ type=C<dynamic>* */ c_optional_closure =
-      new /*@ typeArgs=dynamic */ C.optional(/*@ returnType=Null? */ (
+      new /*@ typeArgs=dynamic */ C.optional(/*@ returnType=Null */ (
           [/*@ type=dynamic */ x = /*@ typeArgs=int* */ const [0]]) {});
   var /*@ type=C<dynamic>* */ c_named_closure = new /*@ typeArgs=dynamic */ C.named(
-      /*@ returnType=Null? */ (
+      /*@ returnType=Null */ (
           {/*@ type=dynamic */ x: /*@ typeArgs=int* */ const [0]}) {});
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
index 3526aad..af395c5 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
@@ -27,8 +27,8 @@
   self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
   self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
   self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
-  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → core::Null? {});
-  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null? {});
+  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
index 3526aad..af395c5 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
@@ -27,8 +27,8 @@
   self::C<dynamic>* c_named_toplevel = new self::C::named<dynamic>(#C4);
   self::C<dynamic>* c_optional_local = new self::C::optional<dynamic>(optional_local);
   self::C<dynamic>* c_named_local = new self::C::named<dynamic>(named_local);
-  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → core::Null? {});
-  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null? {});
+  self::C<dynamic>* c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → Null {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → Null {});
 }
 
 constants  {
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
index 747ad06..fab3f55 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
@@ -9,7 +9,7 @@
   num n = null;
   if (n is int) {
     var /*@ type=num* */ i = n;
-    /*@ returnType=Null? */ () {
+    /*@ returnType=Null */ () {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
index 830f06e..db5f0ef 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
@@ -6,7 +6,7 @@
   core::num* n = null;
   if(n is core::int*) {
     core::num* i = n;
-    () → core::Null? {
+    () → Null {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
index 830f06e..db5f0ef 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
@@ -6,7 +6,7 @@
   core::num* n = null;
   if(n is core::int*) {
     core::num* i = n;
-    () → core::Null? {
+    () → Null {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
index dbbc0b1..ee7c1e7 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
@@ -10,7 +10,7 @@
   if (n is int) {
     var /*@ type=num* */ i = n;
   }
-  /*@ returnType=Null? */ () {
+  /*@ returnType=Null */ () {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
index 41ec7b8..d377034 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
@@ -7,7 +7,7 @@
   if(n is core::int*) {
     core::num* i = n;
   }
-  () → core::Null? {
+  () → Null {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
index 41ec7b8..d377034 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   if(n is core::int*) {
     core::num* i = n;
   }
-  () → core::Null? {
+  () → Null {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart b/pkg/front_end/testcases/inference_new/const_invocation.dart
index 4e58d44..2bb0320 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart
@@ -8,16 +8,16 @@
 typedef V F<U, V>(U u);
 
 class Foo<T> {
-  Bar<T> get v1 => const /*@typeArgs=Null?*/ Bar();
-  Bar<List<T>> get v2 => const /*@ typeArgs=List<Null?>* */ Bar();
-  Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null? */ Bar();
+  Bar<T> get v1 => const /*@ typeArgs=Null */ Bar();
+  Bar<List<T>> get v2 => const /*@ typeArgs=List<Null>* */ Bar();
+  Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null */ Bar();
   Bar<F<F<T, T>, T>> get v4 =>
-      const /*@ typeArgs=((Null?) ->* Object*) ->* Null? */ Bar();
-  List<T> get v5 => /*@ typeArgs=Null? */ const [];
-  List<F<T, T>> get v6 => /*@ typeArgs=(Object*) ->* Null? */ const [];
-  Map<T, T> get v7 => /*@ typeArgs=Null?, Null? */ const {};
-  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Object*) ->* Null?, Null? */ const {};
-  Map<T, F<T, T>> get v9 => /*@ typeArgs=Null?, (Object*) ->* Null? */ const {};
+      const /*@ typeArgs=((Null) ->* Object*) ->* Null */ Bar();
+  List<T> get v5 => /*@ typeArgs=Null */ const [];
+  List<F<T, T>> get v6 => /*@ typeArgs=(Object*) ->* Null */ const [];
+  Map<T, T> get v7 => /*@ typeArgs=Null, Null */ const {};
+  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Object*) ->* Null, Null */ const {};
+  Map<T, F<T, T>> get v9 => /*@ typeArgs=Null, (Object*) ->* Null */ const {};
 }
 
 class Bar<T> {
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
index f4ffe78..fbcc92b 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
@@ -54,14 +54,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Bar<core::Null?> {}
-  #C2 = self::Bar<core::List<core::Null?>*> {}
-  #C3 = self::Bar<(core::Object*) →* core::Null?> {}
-  #C4 = self::Bar<((core::Null?) →* core::Object*) →* core::Null?> {}
-  #C5 = <core::Null?>[]
-  #C6 = <(core::Object*) →* core::Null?>[]
+  #C1 = self::Bar<Null> {}
+  #C2 = self::Bar<core::List<Null>*> {}
+  #C3 = self::Bar<(core::Object*) →* Null> {}
+  #C4 = self::Bar<((Null) →* core::Object*) →* Null> {}
+  #C5 = <Null>[]
+  #C6 = <(core::Object*) →* Null>[]
   #C7 = <dynamic>[]
-  #C8 = core::_ImmutableMap<core::Null?, core::Null?> {_kvPairs:#C7}
-  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null?, core::Null?> {_kvPairs:#C7}
-  #C10 = core::_ImmutableMap<core::Null?, (core::Object*) →* core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<Null, Null> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* Null, Null> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<Null, (core::Object*) →* Null> {_kvPairs:#C7}
 }
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
index f4ffe78..fbcc92b 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
@@ -54,14 +54,14 @@
 static method main() → dynamic {}
 
 constants  {
-  #C1 = self::Bar<core::Null?> {}
-  #C2 = self::Bar<core::List<core::Null?>*> {}
-  #C3 = self::Bar<(core::Object*) →* core::Null?> {}
-  #C4 = self::Bar<((core::Null?) →* core::Object*) →* core::Null?> {}
-  #C5 = <core::Null?>[]
-  #C6 = <(core::Object*) →* core::Null?>[]
+  #C1 = self::Bar<Null> {}
+  #C2 = self::Bar<core::List<Null>*> {}
+  #C3 = self::Bar<(core::Object*) →* Null> {}
+  #C4 = self::Bar<((Null) →* core::Object*) →* Null> {}
+  #C5 = <Null>[]
+  #C6 = <(core::Object*) →* Null>[]
   #C7 = <dynamic>[]
-  #C8 = core::_ImmutableMap<core::Null?, core::Null?> {_kvPairs:#C7}
-  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null?, core::Null?> {_kvPairs:#C7}
-  #C10 = core::_ImmutableMap<core::Null?, (core::Object*) →* core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<Null, Null> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* Null, Null> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<Null, (core::Object*) →* Null> {_kvPairs:#C7}
 }
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
index f8811d5..95a8a3b 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@ typeArgs=Null? */ [null];
+var x = /*@ typeArgs=Null */ [null];
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
index e4f67d0..d051539 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x;
+static field core::List<Null>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
index aa63d12..30af47a 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x = <core::Null?>[null];
+static field core::List<Null>* x = <Null>[null];
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
index aa63d12..30af47a 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null?>* x = <core::Null?>[null];
+static field core::List<Null>* x = <Null>[null];
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
index 03f228f..4acd9c4 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@ typeArgs=Null?, Null? */ {null: null};
+var x = /*@ typeArgs=Null, Null */ {null: null};
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
index f7f9db3..3a23ea0 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x;
+static field core::Map<Null, Null>* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
index 4f1d6de..c5b6db9 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
+static field core::Map<Null, Null>* x = <Null, Null>{null: null};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
index 4f1d6de..c5b6db9 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null?, core::Null?>* x = <core::Null?, core::Null?>{null: null};
+static field core::Map<Null, Null>* x = <Null, Null>{null: null};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 432f2f8..939b47e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
index 0b96aa5..b96266f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
@@ -48,5 +48,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null?) →* self::B<dynamic, dynamic>*, core::num*>* d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (Null) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
index 0b96aa5..b96266f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (core::Null?) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+class D<X extends self::B<self::D::X*, self::D::Y*>* = self::B<dynamic, dynamic>*, Y extends self::C<self::D::X*, self::D::Y*>* = self::C<dynamic, dynamic>*, Z extends (self::D::Y*) →* self::D::X* = (Null) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
@@ -48,5 +48,5 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null?) →* self::B<dynamic, dynamic>*, core::num*>* d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (Null) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 368e3fc..d6d83e0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,6 +16,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
index 9ccc7a3..c86f6b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,5 +17,5 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
index 9ccc7a3..c86f6b2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,5 +17,5 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<core::num*, (core::Null?) →* void>* c;
+static field self::C<core::num*, (Null) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index bb09bc8..84e4164 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc;
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc;
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc;
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
index 2064da3..52cdb64 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,6 +17,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc = <self::C<core::num*, (core::Null?) →* void>*>[];
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc = <self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>{};
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc = <self::C<core::num*, (Null) →* void>*>[];
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc = <self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
index 2064da3..52cdb64 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null?) →* void> extends core::Object {
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -17,6 +17,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<core::num*, (core::Null?) →* void>*>* lc = <self::C<core::num*, (core::Null?) →* void>*>[];
-static field core::Map<self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>* mc = <self::C<core::num*, (core::Null?) →* void>*, self::C<core::num*, (core::Null?) →* void>*>{};
+static field core::List<self::C<core::num*, (Null) →* void>*>* lc = <self::C<core::num*, (Null) →* void>*>[];
+static field core::Map<self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>* mc = <self::C<core::num*, (Null) →* void>*, self::C<core::num*, (Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index 66c369f..e4a28c9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
index 718920a..e4ecd94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,6 +32,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
index 718920a..e4ecd94 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,6 +32,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>* d;
-static field self::E<(core::Null?) →* void>* e;
+static field self::D<(Null, Null) →* void, (Null, Null) →* void>* d;
+static field self::E<(Null) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index 4090043..40367c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,9 +30,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld;
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md;
-static field core::List<self::E<(core::Null?) →* void>*>* le;
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me;
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld;
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md;
+static field core::List<self::E<(Null) →* void>*>* le;
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
index 5013f6a2..eaaf4d5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,8 +32,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>[];
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>{};
-static field core::List<self::E<(core::Null?) →* void>*>* le = <self::E<(core::Null?) →* void>*>[];
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me = <self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>{};
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld = <self::D<(Null, Null) →* void, (Null, Null) →* void>*>[];
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md = <self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>{};
+static field core::List<self::E<(Null) →* void>*>* le = <self::E<(Null) →* void>*>[];
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me = <self::E<(Null) →* void>*, self::E<(Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index 5013f6a2..eaaf4d5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (core::Null?, core::Null?) →* void> extends core::Object {
+class D<X extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void, Y extends (self::D::X*, self::D::Y*) →* void = (Null, Null) →* void> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* void = (core::Null?) →* void> extends core::Object {
+class E<X extends (self::E::X*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -32,8 +32,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* ld = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>[];
-static field core::Map<self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>* md = <self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*, self::D<(core::Null?, core::Null?) →* void, (core::Null?, core::Null?) →* void>*>{};
-static field core::List<self::E<(core::Null?) →* void>*>* le = <self::E<(core::Null?) →* void>*>[];
-static field core::Map<self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>* me = <self::E<(core::Null?) →* void>*, self::E<(core::Null?) →* void>*>{};
+static field core::List<self::D<(Null, Null) →* void, (Null, Null) →* void>*>* ld = <self::D<(Null, Null) →* void, (Null, Null) →* void>*>[];
+static field core::Map<self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>* md = <self::D<(Null, Null) →* void, (Null, Null) →* void>*, self::D<(Null, Null) →* void, (Null, Null) →* void>*>{};
+static field core::List<self::E<(Null) →* void>*>* le = <self::E<(Null) →* void>*>[];
+static field core::Map<self::E<(Null) →* void>*, self::E<(Null) →* void>*>* me = <self::E<(Null) →* void>*, self::E<(Null) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index ee773ec..7d85a42 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
index cf12e75..1586c3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,6 +47,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
index cf12e75..1586c3d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,6 +47,6 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C<dynamic, (core::Null?) →* dynamic>* c;
-static field self::D<core::num*, (core::Null?) →* core::num*>* d;
+static field self::C<dynamic, (Null) →* dynamic>* c;
+static field self::D<core::num*, (Null) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index c483e76..e2d5490 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,9 +44,9 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc;
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc;
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld;
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md;
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc;
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc;
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld;
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
index 760dbc6..edf4bbf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,8 +47,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc = <self::C<dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc = <self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld = <self::D<core::num*, (core::Null?) →* core::num*>*>[];
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md = <self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>{};
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc = <self::C<dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc = <self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld = <self::D<core::num*, (Null) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md = <self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
index 760dbc6..edf4bbf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null?) →* dynamic> extends core::Object {
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null?) →* core::num*> extends core::Object {
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (Null) →* core::num*> extends core::Object {
   synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
@@ -47,8 +47,8 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C<dynamic, (core::Null?) →* dynamic>*>* lc = <self::C<dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>* mc = <self::C<dynamic, (core::Null?) →* dynamic>*, self::C<dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D<core::num*, (core::Null?) →* core::num*>*>* ld = <self::D<core::num*, (core::Null?) →* core::num*>*>[];
-static field core::Map<self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>* md = <self::D<core::num*, (core::Null?) →* core::num*>*, self::D<core::num*, (core::Null?) →* core::num*>*>{};
+static field core::List<self::C<dynamic, (Null) →* dynamic>*>* lc = <self::C<dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>* mc = <self::C<dynamic, (Null) →* dynamic>*, self::C<dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (Null) →* core::num*>*>* ld = <self::D<core::num*, (Null) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>* md = <self::D<core::num*, (Null) →* core::num*>*, self::D<core::num*, (Null) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index 0a70645..df65afc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -136,7 +136,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -155,7 +155,7 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
index a739066..d8cb6c1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     : super core::Object::•()
     ;
@@ -145,7 +145,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     : super core::Object::•()
     ;
@@ -165,6 +165,6 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
index a739066..d8cb6c1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
@@ -130,7 +130,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (core::Null?) →* dynamic, W extends (self::I::X*) →* dynamic = (core::Null?) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null?) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
+class I<T extends invalid-type = invalid-type, U extends self::I::Y* = invalid-type, V extends (self::I::W*) →* dynamic = (Null) →* dynamic, W extends (self::I::X*) →* dynamic = (Null) →* dynamic, X extends (self::I::V*) →* dynamic = (Null) →* dynamic, Y extends self::I::Z* = invalid-type, Z extends self::I::T* = invalid-type> extends core::Object {
   synthetic constructor •() → self::I<self::I::T*, self::I::U*, self::I::V*, self::I::W*, self::I::X*, self::I::Y*, self::I::Z*>*
     : super core::Object::•()
     ;
@@ -145,7 +145,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class J<S extends (self::J::U*) →* self::J::T* = (core::Null?) →* dynamic, T extends (self::J::S*) →* self::J::U* = (core::Null?) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null?) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (core::Null?) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
+class J<S extends (self::J::U*) →* self::J::T* = (Null) →* dynamic, T extends (self::J::S*) →* self::J::U* = (Null) →* dynamic, U extends (self::J::T*) →* self::J::S* = (Null) →* dynamic, V extends self::J::W* = dynamic, W extends self::J::X* = dynamic, X extends (self::J::V*) →* self::J::Y* = (Null) →* dynamic, Y extends self::J::Z* = dynamic, Z extends self::J::X* = dynamic> extends core::Object {
   synthetic constructor •() → self::J<self::J::S*, self::J::T*, self::J::U*, self::J::V*, self::J::W*, self::J::X*, self::J::Y*, self::J::Z*>*
     : super core::Object::•()
     ;
@@ -165,6 +165,6 @@
 static field self::F<core::num*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, self::C<self::B<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*>*, dynamic>*>* f;
 static field self::G<core::num*, self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*, self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, self::C<self::B<self::B<core::num*, dynamic>*, self::C<dynamic, core::num*>*>*, dynamic>*>* g;
 static field self::H<self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*, self::A<dynamic>*, self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, self::A<dynamic>*>* h;
-static field self::I<invalid-type, invalid-type, (core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, invalid-type, invalid-type>* i;
-static field self::J<(core::Null?) →* dynamic, (core::Null?) →* dynamic, (core::Null?) →* dynamic, dynamic, dynamic, (core::Null?) →* dynamic, dynamic, dynamic>* j;
+static field self::I<invalid-type, invalid-type, (Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, invalid-type, invalid-type>* i;
+static field self::J<(Null) →* dynamic, (Null) →* dynamic, (Null) →* dynamic, dynamic, dynamic, (Null) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index e79c974..b47cdbb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -72,7 +72,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -114,7 +114,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -128,7 +128,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -142,14 +142,14 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
index 6e8653f..381fd70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,13 +152,13 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
index 6e8653f..381fd70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,13 +152,13 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c1;
-static field self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>* c2;
-static field self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c3;
-static field self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>* c4;
-static field self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d1;
-static field self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>* d2;
-static field self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d3;
-static field self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>* d4;
-static field self::E<(core::Null?) →* dynamic>* e;
+static field self::C1<(Null) →* dynamic, (Null) →* dynamic>* c1;
+static field self::C2<(Null) →* dynamic, (Null) →* dynamic>* c2;
+static field self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c3;
+static field self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>* d4;
+static field self::E<(Null) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index c0655e7..eee0aab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -16,7 +16,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -30,7 +30,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -44,7 +44,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -58,7 +58,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -72,7 +72,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -86,7 +86,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -100,7 +100,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -114,7 +114,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -128,7 +128,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -142,23 +142,23 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1;
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1;
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2;
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2;
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3;
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3;
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4;
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4;
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1;
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1;
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2;
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2;
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3;
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3;
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4;
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4;
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le;
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me;
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1;
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1;
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2;
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2;
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3;
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3;
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4;
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4;
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1;
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1;
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2;
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2;
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3;
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3;
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4;
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4;
+static field core::List<self::E<(Null) →* dynamic>*>* le;
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
index 24668cb..57e2111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,22 +152,22 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le = <self::E<(core::Null?) →* dynamic>*>[];
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me = <self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>{};
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::E<(Null) →* dynamic>*>* le = <self::E<(Null) →* dynamic>*>[];
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me = <self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
index 24668cb..57e2111 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C1<X extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (core::Null?) →* dynamic> extends core::Object {
+class C1<X extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic, Y extends (self::C1::Y*) →* self::C1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
@@ -32,7 +32,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C2<X extends (self::C2::Y*) →* self::C2::X* = (core::Null?) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class C2<X extends (self::C2::Y*) →* self::C2::X* = (Null) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
@@ -47,7 +47,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C3<X extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic, Y extends (self::C3::X*, self::C3::Y*) →* self::C3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
@@ -62,7 +62,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (core::Null?, core::Null?) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class C4<X extends (self::C4::X*, self::C4::Y*) →* self::C4::X* = (Null, Null) →* dynamic, Y extends (self::C4::X*, self::C4::Y*) →* self::C4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
@@ -77,7 +77,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (core::Null?) →* dynamic> extends core::Object {
+class D1<X extends self::B<self::D1::X*, self::D1::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y*) →* self::D1::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
@@ -92,7 +92,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (core::Null?) →* dynamic> extends core::Object {
+class D2<X extends self::B<self::D2::X*, self::D2::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
@@ -107,7 +107,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D3<X extends self::B<self::D3::X*, self::D3::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D3::X*, self::D3::Y*) →* self::D3::X* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
@@ -122,7 +122,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (core::Null?, core::Null?) →* dynamic> extends core::Object {
+class D4<X extends self::B<self::D4::X*, self::D4::Y*>* = self::B<dynamic, dynamic>*, Y extends (self::D4::X*, self::D4::Y*) →* self::D4::Y* = (Null, Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
@@ -137,7 +137,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class E<X extends (self::E::X*) →* self::E::X* = (core::Null?) →* dynamic> extends core::Object {
+class E<X extends (self::E::X*) →* self::E::X* = (Null) →* dynamic> extends core::Object {
   synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
@@ -152,22 +152,22 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::List<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc1 = <self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C1<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* lc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>* mc2 = <self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*, self::C2<(core::Null?) →* dynamic, (core::Null?) →* dynamic>*>{};
-static field core::List<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc3 = <self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C3<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* lc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>* mc4 = <self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*, self::C4<(core::Null?, core::Null?) →* dynamic, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null?) →* dynamic>*>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null?, core::Null?) →* dynamic>*>{};
-static field core::List<self::E<(core::Null?) →* dynamic>*>* le = <self::E<(core::Null?) →* dynamic>*>[];
-static field core::Map<self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>* me = <self::E<(core::Null?) →* dynamic>*, self::E<(core::Null?) →* dynamic>*>{};
+static field core::List<self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* lc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>* mc1 = <self::C1<(Null) →* dynamic, (Null) →* dynamic>*, self::C1<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* lc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*>[];
+static field core::Map<self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>* mc2 = <self::C2<(Null) →* dynamic, (Null) →* dynamic>*, self::C2<(Null) →* dynamic, (Null) →* dynamic>*>{};
+static field core::List<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc3 = <self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C3<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* lc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>* mc4 = <self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*, self::C4<(Null, Null) →* dynamic, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (Null) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (Null, Null) →* dynamic>*>{};
+static field core::List<self::E<(Null) →* dynamic>*>* le = <self::E<(Null) →* dynamic>*>[];
+static field core::Map<self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>* me = <self::E<(Null) →* dynamic>*, self::E<(Null) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
index 3fb9073..fd3806b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -23,7 +23,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
index b37cf28..74416db 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -24,7 +24,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
index b37cf28..74416db 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null?>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
+class Fisk<TypeY extends <TypeZ extends self::Hest<Null>* = dynamic>(TypeZ*) →* dynamic = dynamic> extends core::Object {
   synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
index 3ef6e6c..ec6a51e 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.expect
@@ -64,7 +64,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -105,7 +105,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -151,7 +151,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   function #local4#get() → core::int
     return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t17{core::int};
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
index 3ef6e6c..ec6a51e 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.strong.transformed.expect
@@ -64,7 +64,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -105,7 +105,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -151,7 +151,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   function #local4#get() → core::int
     return let final core::int? #t17 = local4 in #t17.==(null) ?{core::int} throw new _in::LateError::localNI("local4") : #t17{core::int};
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
index 20cf2a00..0b4576c 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.expect
@@ -64,7 +64,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -111,7 +111,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -163,7 +163,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
diff --git a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
index 20cf2a00..0b4576c 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_assigned.dart.weak.transformed.expect
@@ -64,7 +64,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -111,7 +111,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   final T? local2;
   core::bool #local2#isSet = false;
   function #local2#get() → T%
@@ -163,7 +163,7 @@
   local6 = 0; // error
   ^^^^^^" in #local6#set.call(0);
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   final core::int? local4;
   core::bool #local4#isSet = false;
   function #local4#get() → core::int
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
index 00d7254..9fd2c07 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.expect
@@ -96,7 +96,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -151,7 +151,7 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -209,7 +209,7 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
index 00d7254..9fd2c07 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.strong.transformed.expect
@@ -96,7 +96,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -151,7 +151,7 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -209,7 +209,7 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   function #local4#get() → core::int
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
index c162162..be1e0a1 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.expect
@@ -96,7 +96,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -157,7 +157,7 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -221,7 +221,7 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   core::bool #local4#isSet = false;
diff --git a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
index c162162..be1e0a1 100644
--- a/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/definitely_unassigned.dart.weak.transformed.expect
@@ -96,7 +96,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -157,7 +157,7 @@
   ^^^^^^" in #local6#get.call();
   #local7#get.call();
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   T? local2;
   core::bool #local2#isSet = false;
@@ -221,7 +221,7 @@
   #local6#get.call();
   #local7#get.call();
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   core::int? local4;
   core::bool #local4#isSet = false;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
index 34dd272..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.expect
@@ -19,7 +19,7 @@
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
index 34dd272..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
index 34dd272..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.expect
@@ -19,7 +19,7 @@
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
index 34dd272..7e000ad 100644
--- a/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/issue40601.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
       return value = #t1;
     }
     () → dynamic result = () → dynamic => this.{self::A::bar}(#value#get.call());
-    (() → core::Null? {
+    (() → Null {
       #value#set.call(this.{self::A::baz}());
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
index 2f84c91..8a5dd62 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.expect
@@ -13,7 +13,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
index 2f84c91..8a5dd62 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.strong.transformed.expect
@@ -13,7 +13,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
index bfa3459..76adb10 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
index bfa3459..76adb10 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T% value) → T% {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
index f10adef..5052aa475 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.expect
@@ -22,7 +22,7 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
index f10adef..5052aa475 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.strong.transformed.expect
@@ -22,7 +22,7 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
index 069d6bd..4a3c1ef 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.expect
@@ -25,7 +25,7 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
index 069d6bd..4a3c1ef 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_local_without_initializer.dart.weak.transformed.expect
@@ -25,7 +25,7 @@
     self::expect(123, #lateLocal#get.call());
   }
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
index a134538..ffb22f1 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(null, lateLocalInit);
   self::expect(123, #lateLocal#get.call());
   self::expect(123, lateLocalInit);
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocalInit;
     function initLateGenericLocal(T? value) → T? {
       return lateGenericLocalInit = value;
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
index 6d26180..37fa15a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.expect
@@ -21,7 +21,7 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
index 35e6af5..3dfd218 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
index 6d26180..37fa15a 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.expect
@@ -21,7 +21,7 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
index 35e6af5..3dfd218 100644
--- a/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_final_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   }
   self::expect(123, #lateLocal#get.call());
   self::throws(() → core::int => #lateLocal#set.call(124), "Write value to initialized lateLocal");
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     final T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
index 9fbaf26..d08871e 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.expect
@@ -11,7 +11,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
index 9fbaf26..d08871e 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
index 81e2022..c681474 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.expect
@@ -19,7 +19,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
index 81e2022..c681474 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_with_initializer.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value1, T% value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T% {
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
index 36a822e..0f888e9 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.expect
@@ -12,7 +12,7 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
index 36a822e..0f888e9 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
index fc0779c..49dc955 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
index fc0779c..49dc955 100644
--- a/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_local_without_initializer.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T% value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T% value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T%
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
index dea8137..44a6c7f 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_with_initializer.dart.weak.transformed.expect
@@ -21,7 +21,7 @@
   self::expect(123, #lateLocal#get.call());
   self::expect(124, #lateLocal#set.call(124));
   self::expect(124, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value1, T? value2) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T? {
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
index 91dd9f8..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
index 91dd9f8..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
index 91dd9f8..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
index 91dd9f8..d1c2417 100644
--- a/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/late_nullable_local_without_initializer.dart.weak.transformed.expect
@@ -15,7 +15,7 @@
   self::throws(() → core::int? => #lateLocal#get.call(), "Read value from uninitialized lateLocal");
   self::expect(123, #lateLocal#set.call(123));
   self::expect(123, #lateLocal#get.call());
-  function local<T extends core::Object? = dynamic>(T? value) → core::Null? {
+  function local<T extends core::Object? = dynamic>(T? value) → Null {
     T? lateGenericLocal;
     core::bool #lateGenericLocal#isSet = false;
     function #lateGenericLocal#get() → T?
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
index b0a568a..03ef078 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.expect
@@ -30,11 +30,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
index b0a568a..03ef078 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.strong.transformed.expect
@@ -30,11 +30,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
index 9f26c1e..53ea9c9 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.expect
@@ -23,11 +23,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
index 9f26c1e..53ea9c9 100644
--- a/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/late_lowering/non_nullable_from_opt_out.dart.weak.transformed.expect
@@ -23,11 +23,11 @@
   non::expect(null, c.{non::Class::finalInstanceTypeVariable});
   non::expect(null, non::Class::staticField);
   non::expect(null, non::Class::staticFinalField);
-  non::throws(() → core::Null? => non::finalTopLevelField = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceField} = null);
-  non::throws(() → core::Null? => c.{non::Class::finalInstanceTypeVariable} = null);
-  non::throws(() → core::Null? => non::Class::staticFinalField = null);
-  non::method<core::Null?>(true, null, null);
+  non::throws(() → Null => non::finalTopLevelField = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceField} = null);
+  non::throws(() → Null => c.{non::Class::finalInstanceTypeVariable} = null);
+  non::throws(() → Null => non::Class::staticFinalField = null);
+  non::method<Null>(true, null, null);
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
index 04a6535..02239ae 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.outline.expect
@@ -22,29 +22,29 @@
 static final field core::bool isWeakMode;
 static const field core::bool c0 = null is{ForNonNullableByDefault} core::int?;
 static const field core::bool c1 = null is{ForNonNullableByDefault} core::int;
-static const field core::bool c2 = null is{ForNonNullableByDefault} core::Null?;
+static const field core::bool c2 = null is{ForNonNullableByDefault} Null;
 static const field core::bool c3 = null is{ForNonNullableByDefault} Never?;
 static const field core::bool c4 = null is{ForNonNullableByDefault} Never;
 static const field core::bool c5 = null is{ForNonNullableByDefault} FutureOr<core::int?>;
 static const field core::bool c6 = null is{ForNonNullableByDefault} FutureOr<core::int>;
 static const field core::bool c7 = null is{ForNonNullableByDefault} FutureOr<core::int>?;
-static const field core::bool c8 = null is{ForNonNullableByDefault} FutureOr<core::Null?>;
-static const field core::bool c9 = null is{ForNonNullableByDefault} FutureOr<core::Null?>?;
+static const field core::bool c8 = null is{ForNonNullableByDefault} FutureOr<Null>;
+static const field core::bool c9 = null is{ForNonNullableByDefault} FutureOr<Null>?;
 static const field core::bool c10 = null is{ForNonNullableByDefault} FutureOr<Never>;
 static const field core::bool c11 = null is{ForNonNullableByDefault} FutureOr<Never?>;
 static const field core::bool c12 = null is{ForNonNullableByDefault} FutureOr<Never>?;
 static const field self::Class<core::int> e1 = const self::Class::constructor1<core::int>(null);
 static const field self::Class<core::int?> e2 = const self::Class::constructor1<core::int?>(null);
-static const field self::Class<core::Null?> e3 = const self::Class::constructor1<core::Null?>(null);
+static const field self::Class<Null> e3 = const self::Class::constructor1<Null>(null);
 static const field self::Class<core::int> e4 = const self::Class::constructor2<core::int>(null);
 static const field self::Class<core::int?> e5 = const self::Class::constructor2<core::int?>(null);
-static const field self::Class<core::Null?> e6 = const self::Class::constructor2<core::Null?>(null);
+static const field self::Class<Null> e6 = const self::Class::constructor2<Null>(null);
 static const field self::Class<core::int> e7 = const self::Class::constructor3<core::int>(null);
 static const field self::Class<core::int?> e8 = const self::Class::constructor3<core::int?>(null);
-static const field self::Class<core::Null?> e9 = const self::Class::constructor3<core::Null?>(null);
+static const field self::Class<Null> e9 = const self::Class::constructor3<Null>(null);
 static const field self::Class<core::int> e10 = const self::Class::constructor4<core::int>(null);
 static const field self::Class<core::int?> e11 = const self::Class::constructor4<core::int?>(null);
-static const field self::Class<core::Null?> e12 = const self::Class::constructor4<core::Null?>(null);
+static const field self::Class<Null> e12 = const self::Class::constructor4<Null>(null);
 static method main() → dynamic
   ;
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic
@@ -67,14 +67,14 @@
 Evaluated: IsExpression @ org-dartlang-testcase:///constant_null_is.dart:21:18 -> BoolConstant(true)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:22:18 -> InstanceConstant(const Class<int>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:23:18 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:24:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:24:18 -> InstanceConstant(const Class<Null>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:25:18 -> InstanceConstant(const Class<int>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:26:18 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:27:18 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:27:18 -> InstanceConstant(const Class<Null>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:28:18 -> InstanceConstant(const Class<int>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:29:18 -> InstanceConstant(const Class<int?>{Class.field: false})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:30:18 -> InstanceConstant(const Class<Null?>{Class.field: false})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:30:18 -> InstanceConstant(const Class<Null>{Class.field: false})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:31:19 -> InstanceConstant(const Class<int>{Class.field: true})
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:32:19 -> InstanceConstant(const Class<int?>{Class.field: true})
-Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null?>{Class.field: true})
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constant_null_is.dart:33:19 -> InstanceConstant(const Class<Null>{Class.field: true})
 Extra constant evaluation: evaluated: 33, effectively constant: 25
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
index 38d97af..fd5c283 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C5;
-static const field self::Class<core::Null?> e3 = #C6;
+static const field self::Class<Null> e3 = #C6;
 static const field self::Class<core::int> e4 = #C7;
 static const field self::Class<core::int?> e5 = #C5;
-static const field self::Class<core::Null?> e6 = #C6;
+static const field self::Class<Null> e6 = #C6;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C8;
-static const field self::Class<core::Null?> e9 = #C9;
+static const field self::Class<Null> e9 = #C9;
 static const field self::Class<core::int> e10 = #C7;
 static const field self::Class<core::int?> e11 = #C5;
-static const field self::Class<core::Null?> e12 = #C6;
+static const field self::Class<Null> e12 = #C6;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C5).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,13 +81,13 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int> {field:#C3}
   #C5 = self::Class<core::int?> {field:#C2}
-  #C6 = self::Class<core::Null?> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
   #C7 = self::Class<core::int> {field:#C2}
   #C8 = self::Class<core::int?> {field:#C3}
-  #C9 = self::Class<core::Null?> {field:#C3}
+  #C9 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
index 72bc1d1..a6548c6 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.strong.transformed.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C5;
-static const field self::Class<core::Null?> e3 = #C6;
+static const field self::Class<Null> e3 = #C6;
 static const field self::Class<core::int> e4 = #C7;
 static const field self::Class<core::int?> e5 = #C5;
-static const field self::Class<core::Null?> e6 = #C6;
+static const field self::Class<Null> e6 = #C6;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C8;
-static const field self::Class<core::Null?> e9 = #C9;
+static const field self::Class<Null> e9 = #C9;
 static const field self::Class<core::int> e10 = #C7;
 static const field self::Class<core::int?> e11 = #C5;
-static const field self::Class<core::Null?> e12 = #C6;
+static const field self::Class<Null> e12 = #C6;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C5).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C8).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C9).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,15 +81,15 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int> {field:#C3}
   #C5 = self::Class<core::int?> {field:#C2}
-  #C6 = self::Class<core::Null?> {field:#C2}
+  #C6 = self::Class<Null> {field:#C2}
   #C7 = self::Class<core::int> {field:#C2}
   #C8 = self::Class<core::int?> {field:#C3}
-  #C9 = self::Class<core::Null?> {field:#C3}
+  #C9 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
index 1c2af1f..5ff7516 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,11 +81,11 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
index 4bd5117..72bc3fa 100644
--- a/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constant_null_is.dart.weak.transformed.expect
@@ -35,45 +35,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
   if(!expected.{core::Object::==}(actual))
@@ -81,13 +81,13 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
index 4de21ca..2ca773c 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.outline.expect
@@ -69,10 +69,10 @@
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:13:29 -> TypeLiteralConstant(dynamic Function(dynamic))
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants.dart:14:36 -> TypeLiteralConstant(T% Function<T>(T%))
 Evaluated: ListLiteral @ org-dartlang-testcase:///constants.dart:15:26 -> ListConstant(const <int>[0])
-Evaluated: SetLiteral @ org-dartlang-testcase:///constants.dart:16:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants.dart:16:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapLiteral @ org-dartlang-testcase:///constants.dart:17:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: ListConcatenation @ org-dartlang-testcase:///constants.dart:18:32 -> ListConstant(const <int>[0])
-Evaluated: SetConcatenation @ org-dartlang-testcase:///constants.dart:19:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants.dart:19:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapConcatenation @ org-dartlang-testcase:///constants.dart:20:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:23:5 -> BoolConstant(true)
 Evaluated: StaticInvocation @ org-dartlang-testcase:///constants.dart:25:5 -> BoolConstant(true)
@@ -92,9 +92,9 @@
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:20:29 -> TypeLiteralConstant(dynamic Function(dynamic))
 Evaluated: TypeLiteral @ org-dartlang-testcase:///constants_lib.dart:21:36 -> TypeLiteralConstant(T% Function<T>(T%))
 Evaluated: ListLiteral @ org-dartlang-testcase:///constants_lib.dart:22:26 -> ListConstant(const <int>[0])
-Evaluated: SetLiteral @ org-dartlang-testcase:///constants_lib.dart:23:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///constants_lib.dart:23:25 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapLiteral @ org-dartlang-testcase:///constants_lib.dart:24:33 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Evaluated: ListConcatenation @ org-dartlang-testcase:///constants_lib.dart:25:32 -> ListConstant(const <int>[0])
-Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null?>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
+Evaluated: SetConcatenation @ org-dartlang-testcase:///constants_lib.dart:26:31 -> InstanceConstant(const _UnmodifiableSet<int>{_UnmodifiableSet._map: const _ImmutableMap<int, Null>{_ImmutableMap._kvPairs: const <dynamic>[0, null]}})
 Evaluated: MapConcatenation @ org-dartlang-testcase:///constants_lib.dart:27:7 -> InstanceConstant(const _ImmutableMap<int, String>{_ImmutableMap._kvPairs: const <dynamic>[0, "foo"]})
 Extra constant evaluation: evaluated: 35, effectively constant: 34
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
index 6ff5eb2..d2ed836 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
index 6ff5eb2..d2ed836 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.strong.transformed.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
index 787be87..be9f59d 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int*> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
index 787be87..be9f59d 100644
--- a/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/constants.dart.weak.transformed.expect
@@ -98,7 +98,7 @@
   #C8 = <core::int*>[#C4]
   #C9 = null
   #C10 = <dynamic>[#C4, #C9]
-  #C11 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C10}
+  #C11 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C10}
   #C12 = col::_UnmodifiableSet<core::int*> {_map:#C11}
   #C13 = "foo"
   #C14 = <dynamic>[#C4, #C13]
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.strong.transformed.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
index 31532b7..a63baf3 100644
--- a/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_assigned.dart.weak.transformed.expect
@@ -63,7 +63,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -80,7 +80,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   late final T% local2;
   late final core::int local4;
   late final FutureOr<core::int>local6;
@@ -102,7 +102,7 @@
   local6 = 0; // error
   ^^^^^^" in local6 = 0;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   late final core::int local4;
   local4 = 0;
   let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_assigned.dart:88:3: Error: Late final variable 'local4' definitely assigned.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
index 1a5e8e7..4078e3a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect;
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional;
-static field () → core::Null? fieldCompound;
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect;
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional;
+static field () → Null fieldCompound;
 static method methodDirect<T extends core::Object? = dynamic>(self::methodDirect::T% value) → dynamic
   ;
 static method methodConditional<T extends core::Object? = dynamic>(core::bool b, self::methodConditional::T% value) → dynamic
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
index d23513e..1803f4a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -123,7 +123,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -154,7 +154,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
index b7c2c1c..be2309c 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.strong.transformed.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -125,7 +125,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -158,7 +158,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
index d23513e..1803f4a 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -123,7 +123,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -154,7 +154,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
index b7c2c1c..be2309c 100644
--- a/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/definitely_unassigned.dart.weak.transformed.expect
@@ -95,7 +95,7 @@
 
 import "dart:async";
 
-static field <T extends core::Object? = dynamic>(T%) → core::Null? fieldDirect = <T extends core::Object? = dynamic>(T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(T%) → Null fieldDirect = <T extends core::Object? = dynamic>(T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -125,7 +125,7 @@
   ^^^^^^" in local6;
   local7;
 };
-static field <T extends core::Object? = dynamic>(core::bool, T%) → core::Null? fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → core::Null? {
+static field <T extends core::Object? = dynamic>(core::bool, T%) → Null fieldConditional = <T extends core::Object? = dynamic>(core::bool b, T% value) → Null {
   T% local1;
   late T% local2;
   core::int local3;
@@ -158,7 +158,7 @@
   local6;
   local7;
 };
-static field () → core::Null? fieldCompound = () → core::Null? {
+static field () → Null fieldCompound = () → Null {
   core::int local3;
   late core::int local4;
   local3 = (let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/definitely_unassigned.dart:111:3: Error: Non-nullable variable 'local3' must be assigned before it can be used.
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
index c79998e..b4161d9 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.outline.expect
@@ -28,7 +28,7 @@
 Extra constant evaluation status:
 Evaluated: StaticInvocation @ org-dartlang-testcase:///from_agnostic.dart:7:12 -> BoolConstant(false)
 Evaluated: MapLiteral @ org-dartlang-testcase:///from_agnostic.dart:8:12 -> InstanceConstant(const _ImmutableMap<List<int?>, int>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], 0, const <int?>[], 1]})
-Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null?>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
+Evaluated: SetLiteral @ org-dartlang-testcase:///from_agnostic.dart:9:12 -> InstanceConstant(const _UnmodifiableSet<List<int?>>{_UnmodifiableSet._map: const _ImmutableMap<List<int?>, Null>{_ImmutableMap._kvPairs: const <dynamic>[const <int>[], null, const <int?>[], null]}})
 Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:10:12 -> ListConstant(const <int>[])
 Evaluated: StaticGet @ org-dartlang-testcase:///from_agnostic.dart:11:12 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 5, effectively constant: 5
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
index ef5caf7..e114f63 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.expect
@@ -31,6 +31,6 @@
   #C7 = core::_ImmutableMap<core::List<core::int?>, core::int> {_kvPairs:#C6}
   #C8 = null
   #C9 = <dynamic>[#C2, #C8, #C4, #C8]
-  #C10 = core::_ImmutableMap<core::List<core::int?>, core::Null?> {_kvPairs:#C9}
+  #C10 = core::_ImmutableMap<core::List<core::int?>, Null> {_kvPairs:#C9}
   #C11 = col::_UnmodifiableSet<core::List<core::int?>> {_map:#C10}
 }
diff --git a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
index ef5caf7..e114f63 100644
--- a/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/from_agnostic/from_agnostic.dart.strong.transformed.expect
@@ -31,6 +31,6 @@
   #C7 = core::_ImmutableMap<core::List<core::int?>, core::int> {_kvPairs:#C6}
   #C8 = null
   #C9 = <dynamic>[#C2, #C8, #C4, #C8]
-  #C10 = core::_ImmutableMap<core::List<core::int?>, core::Null?> {_kvPairs:#C9}
+  #C10 = core::_ImmutableMap<core::List<core::int?>, Null> {_kvPairs:#C9}
   #C11 = col::_UnmodifiableSet<core::List<core::int?>> {_map:#C10}
 }
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
index bc24ff1..3a5a5b8 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic
+static method foo(Null x) → dynamic
   ;
 static method bar(core::int y) → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
index 14a6598..0c41f17 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(x!);
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
index 14a6598..0c41f17 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(x!);
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
index 4304389..5ffa759 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.expect
@@ -1,9 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(let final Never #t1 = x! in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
index 4304389..5ffa759 100644
--- a/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue39822.dart.weak.transformed.expect
@@ -1,9 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 import "dart:_internal" as _in;
+import "dart:core" as core;
 
-static method foo(core::Null? x) → dynamic {
+static method foo(Null x) → dynamic {
   self::bar(let final Never #t1 = x! in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
 }
 static method bar(core::int y) → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
index 3d1b60c..412e12d 100644
--- a/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue40601.dart.weak.transformed.expect
@@ -11,7 +11,7 @@
   method foo() → dynamic {
     late self::A::T% value;
     () → dynamic result = () → dynamic => this.{self::A::bar}(value);
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
     }).call();
     return result;
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
index f117107..6c3640f 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.expect
@@ -75,7 +75,7 @@
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
index 9ccbc8b..55a469e 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.strong.transformed.expect
@@ -75,7 +75,7 @@
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::_List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
index f117107..6c3640f 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.expect
@@ -75,7 +75,7 @@
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
index 9ccbc8b..55a469e 100644
--- a/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41102.dart.weak.transformed.expect
@@ -75,7 +75,7 @@
 Try using List.filled instead.
 final s3 = new List<int>(2);
                ^" in core::_List::•<core::int>(2);
-static final field dynamic s4 = (() → core::Null? {
+static final field dynamic s4 = (() → Null {
   core::int e = 0;
   switch(e) {
     #L1:
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
index 0213dd7..f683084 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.outline.expect
@@ -1,8 +1,7 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic
   ;
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
index 4419497..8a8d3f2 100644
--- a/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41415.dart.weak.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {}
-static method test<X extends core::Null? = core::Null?, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
-  (core::Null?) → core::int f = (core::Object? x) → core::int => 1;
+static method test<X extends Null = Null, Y extends Never? = Never?, Z extends Never = Never>() → dynamic {
+  (Null) → core::int f = (core::Object? x) → core::int => 1;
   (Never) → core::int g = (core::Object? x) → core::int => 1;
   (Never?) → core::int h = (core::Object? x) → core::int => 1;
   (core::String) → core::int i = (core::String x) → core::int => 1;
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
index a9d3a40..b01f0d8 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static final field core::bool isLegacySubtyping1a;
-static const field core::bool isLegacySubtyping1b = const <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static const field core::bool isLegacySubtyping1b = const <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static final field core::bool isLegacySubtyping2a;
 static const field core::bool isLegacySubtyping2b = const <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
-static const field core::List<core::int> assertLegacySubtyping1 = const <core::Null?>[] as{ForNonNullableByDefault} core::List<core::int>;
+static const field core::List<core::int> assertLegacySubtyping1 = const <Null>[] as{ForNonNullableByDefault} core::List<core::int>;
 static const field core::List<core::int> assertLegacySubtyping2 = const <core::int?>[] as{ForNonNullableByDefault} core::List<core::int>;
 static method main() → void
   ;
@@ -17,6 +17,6 @@
 Extra constant evaluation status:
 Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:6:38 -> BoolConstant(false)
 Evaluated: IsExpression @ org-dartlang-testcase:///issue41657.dart:8:38 -> BoolConstant(false)
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null?>[])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:10:38 -> ListConstant(const <Null>[])
 Evaluated: ListLiteral @ org-dartlang-testcase:///issue41657.dart:12:38 -> ListConstant(const <int?>[])
 Extra constant evaluation: evaluated: 6, effectively constant: 4
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
index 0e06724..b2b28aa 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.expect
@@ -27,7 +27,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
index 0e06724..b2b28aa 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.strong.transformed.expect
@@ -27,7 +27,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
index 2a7e74f..0065c49 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = true
-  #C2 = <core::Null?>[]
+  #C2 = <Null>[]
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
index 2a7e74f..0065c49 100644
--- a/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41657.dart.weak.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::bool isLegacySubtyping1a = <core::Null?>[] is{ForNonNullableByDefault} core::List<core::int>;
+static final field core::bool isLegacySubtyping1a = <Null>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping1b = #C1;
 static final field core::bool isLegacySubtyping2a = <core::int?>[] is{ForNonNullableByDefault} core::List<core::int>;
 static const field core::bool isLegacySubtyping2b = #C1;
@@ -19,6 +19,6 @@
 
 constants  {
   #C1 = true
-  #C2 = <core::Null?>[]
+  #C2 = <Null>[]
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.strong.transformed.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
index 65b8b25..40f1fe1 100644
--- a/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700a.dart.weak.transformed.expect
@@ -13,15 +13,14 @@
 //     ^^^
 //
 import self as self;
-import "dart:core" as core;
 
 static method test() → dynamic {
-  core::Null? x = null;
+  Null x = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:7:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   x.foo();
     ^^^";
-  core::Null? y = null;
+  Null y = null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700a.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
   y.foo();
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
index f71f62c..0ba35af 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null as{TypeError,ForNonNullableByDefault} self::Null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
index ac0d6f4..43bc84a 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.strong.transformed.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,11 +28,10 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
-           ^" in let core::Null? #t2 = null in #t2.==(null) ?{self::Null} #t2 as{TypeError,ForNonNullableByDefault} self::Null : #t2{self::Null};
+           ^" in let Null #t2 = null in #t2.==(null) ?{self::Null} #t2 as{TypeError,ForNonNullableByDefault} self::Null : #t2{self::Null};
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
index f71f62c..0ba35af 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null as{TypeError,ForNonNullableByDefault} self::Null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
index fc3fc98..a18115f 100644
--- a/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue41700b.dart.weak.transformed.expect
@@ -2,9 +2,8 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
-//  - 'Null/*1*/' is from 'dart:core'.
-//  - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+// pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+//  - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
 //   Null x = null;
 //            ^
 //
@@ -29,9 +28,8 @@
     ;
 }
 static method test() → dynamic {
-  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null/*1*/' can't be assigned to a variable of type 'Null/*2*/' because 'Null/*1*/' is nullable and 'Null/*2*/' isn't.
- - 'Null/*1*/' is from 'dart:core'.
- - 'Null/*2*/' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
+  self::Null x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:8:12: Error: A value of type 'Null' can't be assigned to a variable of type 'Null' because 'Null' is nullable and 'Null' isn't.
+ - 'Null' is from 'pkg/front_end/testcases/nnbd/issue41700b.dart'.
   Null x = null;
            ^" in null;
   invalid-expression "pkg/front_end/testcases/nnbd/issue41700b.dart:9:5: Error: The method 'foo' isn't defined for the class 'Null'.
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.strong.transformed.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
index 30ddc8d..eebb429 100644
--- a/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42429.dart.weak.transformed.expect
@@ -183,19 +183,19 @@
   self::A<core::Object> aObject;
   self::A<core::num?> aNumNullable;
   self::A<core::int?> aIntNullable;
-  self::A<core::Null?> aNull;
+  self::A<Null> aNull;
   (core::Object) → dynamic fArgumentObject;
   (core::num?) → dynamic fArgumentNumNullable;
   (core::int?) → dynamic fArgumentIntNullable;
-  (core::Null?) → dynamic fArgumentNull;
+  (Null) → dynamic fArgumentNull;
   () → core::Object fReturnObject;
   () → core::num? fReturnNumNullable;
   () → core::int? fReturnIntNullable;
-  () → core::Null? fReturnNull;
+  () → Null fReturnNull;
   (core::Object) → core::Object fBothObject;
   (core::num?) → core::num? fBothNumNullable;
   (core::int?) → core::int? fBothIntNullable;
-  (core::Null?) → core::Null? fBothNull;
+  (Null) → Null fBothNull;
   () → dynamic fNowhereObject;
   () → dynamic fNowhereNumNullable;
   () → dynamic fNowhereIntNullable;
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
index 384e012..930703f 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.outline.expect
@@ -36,7 +36,7 @@
     ;
   method method1(dynamic o) → core::bool
     ;
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     ;
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
index 91362db..e677ee5 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.strong.expect
@@ -43,7 +43,7 @@
     return super.{self::C::==}(other);
   method method1(dynamic o) → core::bool
     return super.{self::C::==}(o);
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     return super.{self::C::==}(o);
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
index 91362db..e677ee5 100644
--- a/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42603.dart.weak.expect
@@ -43,7 +43,7 @@
     return super.{self::C::==}(other);
   method method1(dynamic o) → core::bool
     return super.{self::C::==}(o);
-  method method2(core::Null? o) → core::bool
+  method method2(Null o) → core::bool
     return super.{self::C::==}(o);
 }
 class E extends core::Object {
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
index 3ada4d6..d2e2ef3 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.outline.expect
@@ -1,10 +1,9 @@
 library /*isNonNullableByDefault*/;
 import self as self;
-import "dart:core" as core;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic
+static method test1(Never n1, Never? n2, Null n3) → dynamic
   ;
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
index 99e529a..ec865de 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.expect
@@ -78,7 +78,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in n1)
@@ -192,7 +192,7 @@
     #t33.{core::Map::[]=}(n1, n1);
   } =>#t33;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t36 = <Never>[];
     for (final Never #t37 in n1)
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
index 6523b4f..30a2fce 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -78,7 +78,7 @@
 import "dart:core" as core;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in n1)
@@ -233,7 +233,7 @@
     #t33.{core::Map::[]=}(n1, n1);
   } =>#t33;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t36 = <Never>[];
     for (final Never #t37 in n1)
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
index 49bea7d..db1601c 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.expect
@@ -79,7 +79,7 @@
 import "dart:_internal" as _in;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in let final Never #t3 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
@@ -193,7 +193,7 @@
     #t55.{core::Map::[]=}(let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t59 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t55;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t60 = <Never>[];
     for (final Never #t61 in let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
diff --git a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
index 87b9b08..a2689d6 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -79,7 +79,7 @@
 import "dart:_internal" as _in;
 import "dart:collection" as col;
 
-static method test1(Never n1, Never? n2, core::Null? n3) → dynamic {
+static method test1(Never n1, Never? n2, Null n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t1 = <Never>[];
     for (final Never #t2 in let final Never #t3 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
@@ -234,7 +234,7 @@
     #t55.{core::Map::[]=}(let final Never #t58 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."), let final Never #t59 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."));
   } =>#t55;
 }
-static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends core::Null? = core::Null?>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
+static method test2<N1 extends Never = Never, N2 extends Never? = Never?, N3 extends Null = Null>(self::test2::N1 n1, self::test2::N2% n2, self::test2::N3% n3) → dynamic {
   core::List<Never> l1 = block {
     final core::List<Never> #t60 = <Never>[];
     for (final Never #t61 in let final self::test2::N1 #t62 = n1 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`."))
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
index f9ad8e5..2ff42f4 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.outline.expect
@@ -112,10 +112,10 @@
   synthetic constructor •() → self::D<self::D::X>
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void
     ;
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void
     ;
@@ -124,9 +124,9 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     ;
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C
+  static factory fact(self::A<self::A<Null>>? a) → self::C
     ;
 }
 extension Extension1<X extends self::A<X%>? = self::A<dynamic>?> on self::A<X%> {
@@ -135,12 +135,12 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void
   ;
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void
   ;
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
index 127779c..54f0536 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
index 10f7711..e77cc1a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.strong.transformed.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
index 127779c..54f0536 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let dynamic #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
index 10f7711..e77cc1a 100644
--- a/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue43211.dart.weak.transformed.expect
@@ -207,13 +207,13 @@
     : super core::Object::•()
     ;
 }
-class B<X extends self::A<core::Null?>? = self::A<core::Null?>?> extends core::Object implements self::A<self::B::X%> {
+class B<X extends self::A<Null>? = self::A<Null>?> extends core::Object implements self::A<self::B::X%> {
   synthetic constructor •() → self::B<self::B::X%>
     : super core::Object::•()
     ;
-  method method1<Y extends self::A<core::Null?>? = self::A<core::Null?>?>(self::A<self::B::method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+  method method1<Y extends self::A<Null>? = self::A<Null>?>(self::A<self::B::method1::Y%> a, self::A<self::A<Null>>? b) → void {
     self::A<self::B::method1::Y%>? c;
-    self::A<self::A<core::Null?>>? d;
+    self::A<self::A<Null>>? d;
   }
   method method2<Y extends core::String = core::String>(self::D<self::B::method2::Y> a, self::D<core::String>? b) → void {
     self::D<self::B::method2::Y>? c;
@@ -224,13 +224,13 @@
   static field dynamic _redirecting# = <dynamic>[self::C::redirect]/*isNullableByDefault*/;
   constructor internal(dynamic _) → self::C
     : super core::Object::•() {
-    self::A<self::A<core::Null?>>? a;
+    self::A<self::A<Null>>? a;
     self::D<core::String>? b;
   }
-  static factory redirect(self::A<self::A<core::Null?>>? a) → self::C
+  static factory redirect(self::A<self::A<Null>>? a) → self::C
     let<BottomType> #redirecting_factory = self::C::internal in invalid-expression;
-  static factory fact(self::A<self::A<core::Null?>>? a) → self::C {
-    self::A<self::A<core::Null?>>? b;
+  static factory fact(self::A<self::A<Null>>? a) → self::C {
+    self::A<self::A<Null>>? b;
     self::D<core::String>? c;
     return new self::C::internal(a);
   }
@@ -241,14 +241,14 @@
   method method2 = self::Extension1|method2;
   tearoff method2 = self::Extension1|get#method2;
 }
-extension ext2<X extends self::A<core::Null?>? = self::A<core::Null?>?> on self::A<X%> {
+extension ext2<X extends self::A<Null>? = self::A<Null>?> on self::A<X%> {
 }
-static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<core::Null?>>? b) → void {
+static method Extension1|method1<X extends self::A<self::Extension1|method1::X%>? = self::A<dynamic>?, Y extends self::A<self::Extension1|method1::Y%>? = self::A<dynamic>?>(final self::A<self::Extension1|method1::X%> #this, self::A<self::Extension1|method1::Y%> a, self::A<self::A<Null>>? b) → void {
   self::A<self::Extension1|method1::Y%>? c;
-  self::A<self::A<core::Null?>>? d;
+  self::A<self::A<Null>>? d;
 }
-static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<core::Null?>>?) → void
-  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<core::Null?>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
+static method Extension1|get#method1<X extends self::A<self::Extension1|get#method1::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method1::X%> #this) → <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%>, self::A<self::A<Null>>?) → void
+  return <Y extends self::A<Y%>? = self::A<dynamic>?>(self::A<Y%> a, self::A<self::A<Null>>? b) → void => self::Extension1|method1<self::Extension1|get#method1::X%, Y%>(#this, a, b);
 static method Extension1|method2<X extends self::A<self::Extension1|method2::X%>? = self::A<dynamic>?, Y extends core::String = core::String>(final self::A<self::Extension1|method2::X%> #this, self::D<self::Extension1|method2::Y> a, self::D<core::String>? b) → void {
   self::D<self::Extension1|method2::Y>? c;
   self::D<core::String>? d;
@@ -256,6 +256,6 @@
 static method Extension1|get#method2<X extends self::A<self::Extension1|get#method2::X%>? = self::A<dynamic>?>(final self::A<self::Extension1|get#method2::X%> #this) → <Y extends core::String = core::String>(self::D<Y>, self::D<core::String>?) → void
   return <Y extends core::String = core::String>(self::D<Y> a, self::D<core::String>? b) → void => self::Extension1|method2<self::Extension1|get#method2::X%, Y>(#this, a, b);
 static method test() → dynamic {
-  self::A<core::Null?> a = new self::A::•<core::Null?>();
+  self::A<Null> a = new self::A::•<Null>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.strong.transformed.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
index 92acca2..0e7e3b1 100644
--- a/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/load_library.dart.weak.transformed.expect
@@ -1,15 +1,14 @@
 library /*isNonNullableByDefault*/;
 import self as self;
 import "dart:async" as asy;
-import "dart:core" as core;
 
 import "dart:math" deferred as math;
 
 static method main() → dynamic {
   asy::Future<dynamic> v1 = LoadLibrary(math);
-  v1.{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v1.{asy::Future::then}<Null>((dynamic _) → Null {});
   () → asy::Future<dynamic> v2 = #C1;
-  v2.call().{asy::Future::then}<core::Null?>((dynamic _) → core::Null? {});
+  v2.call().{asy::Future::then}<Null>((dynamic _) → Null {});
 }
 static method _#loadLibrary_math() → asy::Future<dynamic>
   return LoadLibrary(math);
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
index 8ff567c..100ffd1 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.outline.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m;
+  field FutureOr<Null>m;
   synthetic constructor •() → self::Mixin
     ;
 }
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
index 41252e1..f87569c 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
index 002d4b2..0f52fef 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.strong.transformed.expect
@@ -5,13 +5,13 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
 abstract class _Class&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
index 41252e1..f87569c 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
@@ -20,7 +20,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
index 002d4b2..0f52fef 100644
--- a/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mix_in_field.dart.weak.transformed.expect
@@ -5,13 +5,13 @@
 import "dart:async";
 
 class Mixin extends core::Object {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::Mixin
     : super core::Object::•()
     ;
 }
 abstract class _Class&Object&Mixin extends core::Object implements self::Mixin /*isAnonymousMixin,isEliminatedMixin*/  {
-  field FutureOr<core::Null?>m = null;
+  field FutureOr<Null>m = null;
   synthetic constructor •() → self::_Class&Object&Mixin
     : super core::Object::•()
     ;
@@ -21,7 +21,7 @@
     : super self::_Class&Object&Mixin::•()
     ;
   method test(dynamic t1) → dynamic {
-    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<core::Null?>;
+    this.{self::Mixin::m} = t1 as{TypeError,ForDynamic,ForNonNullableByDefault} FutureOr<Null>;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect
index 16bb524..b0cfefc 100644
--- a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.expect
@@ -39,15 +39,15 @@
   method method1() → void {
     return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method2() → void {
     return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method3() → FutureOr<void> {
-    return asy::Future::value<core::Null?>(null);
+    return asy::Future::value<Null>(null);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect
index 16bb524..b0cfefc 100644
--- a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.strong.transformed.expect
@@ -39,15 +39,15 @@
   method method1() → void {
     return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method2() → void {
     return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method3() → FutureOr<void> {
-    return asy::Future::value<core::Null?>(null);
+    return asy::Future::value<Null>(null);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect
index 16bb524..b0cfefc 100644
--- a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.expect
@@ -39,15 +39,15 @@
   method method1() → void {
     return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method2() → void {
     return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method3() → FutureOr<void> {
-    return asy::Future::value<core::Null?>(null);
+    return asy::Future::value<Null>(null);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect
index 16bb524..b0cfefc 100644
--- a/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart.weak.transformed.expect
@@ -39,15 +39,15 @@
   method method1() → void {
     return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:21:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method2() → void {
     return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/mutual_subtype_norm.dart:25:16: Error: Can't return a value from a void function.
     return new Future<Null>.value(null); // error
-               ^" in asy::Future::value<core::Null?>(null);
+               ^" in asy::Future::value<Null>(null);
   }
   method method3() → FutureOr<void> {
-    return asy::Future::value<core::Null?>(null);
+    return asy::Future::value<Null>(null);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.strong.transformed.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
index 8d4563e..ab8cca2 100644
--- a/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_bound.dart.weak.transformed.expect
@@ -37,7 +37,7 @@
     return self::GenericNever::T;
 }
 static method errors() → dynamic {
-  new self::GenericNever::•<core::Null?>();
+  new self::GenericNever::•<Null>();
   new self::GenericNever::•<void>();
   new self::GenericNever::•<core::int>();
 }
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
index 8a67b5a..1a136213 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.expect
@@ -76,16 +76,16 @@
   x.[]=(42, 42);
   x = x.+(1);
   x = x.+(1);
-  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo();
-  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar;
+  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{Null} null : #t1{Never}.foo();
+  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{Null} null : #t2{Never}.bar;
   let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42;
-  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call();
-  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42);
+  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{Null} null : #t4{Never}.call();
+  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{Null} null : #t5{Never}.[](42);
   let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42);
-  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo();
-  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar;
+  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{Null} null : #t7.foo();
+  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{Null} null : #t8.bar;
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
-  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
+  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{Null} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
index aa42b16..8078ed3 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.strong.transformed.expect
@@ -76,16 +76,16 @@
   x.[]=(42, 42);
   x = x.+(1);
   x = x.+(1);
-  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{core::Null?} null : #t1{Never}.foo();
-  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{core::Null?} null : #t2{Never}.bar;
+  let final Never? #t1 = y in #t1.{core::Object::==}(null) ?{Null} null : #t1{Never}.foo();
+  let final Never? #t2 = y in #t2.{core::Object::==}(null) ?{Null} null : #t2{Never}.bar;
   let final Never? #t3 = y in #t3.{core::Object::==}(null) ?{core::int?} null : #t3{Never}.baz = 42;
-  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{core::Null?} null : #t4{Never}.call();
-  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{core::Null?} null : #t5{Never}.[](42);
+  let final Never? #t4 = y in #t4.{core::Object::==}(null) ?{Null} null : #t4{Never}.call();
+  let final Never? #t5 = y in #t5.{core::Object::==}(null) ?{Null} null : #t5{Never}.[](42);
   let final Never? #t6 = y in #t6.{core::Object::==}(null) ?{core::int?} null : #t6{Never}.[]=(42, 42);
-  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{core::Null?} null : #t7.foo();
-  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{core::Null?} null : #t8.bar;
+  let final Never #t7 = x in #t7.{core::Object::==}(null) ?{Null} null : #t7.foo();
+  let final Never #t8 = x in #t8.{core::Object::==}(null) ?{Null} null : #t8.bar;
   let final Never #t9 = x in #t9.{core::Object::==}(null) ?{core::int?} null : #t9.baz = 42;
-  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{core::Null?} null : #t10.[](42);
+  let final Never #t10 = x in #t10.{core::Object::==}(null) ?{Null} null : #t10.[](42);
   let final Never #t11 = x in #t11.{core::Object::==}(null) ?{core::int?} null : #t11.[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
index ea4279d..8460d43 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.expect
@@ -77,16 +77,16 @@
   (let final Never #t10 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   let final Never #t11 = x = let final Never #t12 = (let final Never #t13 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t14 = x = let final Never #t15 = (let final Never #t16 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{core::Null?} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{core::Null?} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{Null} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{Null} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t23 = y in #t23.{core::Object::==}(null) ?{core::int?} null : (let final Never #t24 = #t23{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{core::Null?} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{core::Null?} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{Null} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{Null} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t31 = y in #t31.{core::Object::==}(null) ?{core::int?} null : (let final Never #t32 = #t31{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
-  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{core::Null?} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{core::Null?} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{Null} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{Null} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t41 = let final Never #t42 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t41.{core::Object::==}(null) ?{core::int?} null : (let final Never #t43 = #t41 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{core::Null?} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{Null} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t48 = let final Never #t49 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t48.{core::Object::==}(null) ?{core::int?} null : (let final Never #t50 = #t48 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
index d677ad0..7e2c429 100644
--- a/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/never_receiver.dart.weak.transformed.expect
@@ -77,16 +77,16 @@
   (let final Never #t10 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   let final Never #t11 = x = let final Never #t12 = (let final Never #t13 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t14 = x = let final Never #t15 = (let final Never #t16 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).+(1) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{core::Null?} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{core::Null?} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t17 = y in #t17.{core::Object::==}(null) ?{Null} null : let final Never #t18 = (let final Never #t19 = #t17{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t20 = y in #t20.{core::Object::==}(null) ?{Null} null : let final Never #t21 = (let final Never #t22 = #t20{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t23 = y in #t23.{core::Object::==}(null) ?{core::int?} null : (let final Never #t24 = #t23{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{core::Null?} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{core::Null?} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t25 = y in #t25.{core::Object::==}(null) ?{Null} null : let final Never #t26 = (let final Never #t27 = #t25{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).call() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never? #t28 = y in #t28.{core::Object::==}(null) ?{Null} null : let final Never #t29 = (let final Never #t30 = #t28{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never? #t31 = y in #t31.{core::Object::==}(null) ?{core::int?} null : (let final Never #t32 = #t31{Never} in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
-  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{core::Null?} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
-  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{core::Null?} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t33 = let final Never #t34 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t33.{core::Object::==}(null) ?{Null} null : let final Never #t35 = (let final Never #t36 = #t33 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).foo() in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t37 = let final Never #t38 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t37.{core::Object::==}(null) ?{Null} null : let final Never #t39 = (let final Never #t40 = #t37 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).bar in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t41 = let final Never #t42 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t41.{core::Object::==}(null) ?{core::int?} null : (let final Never #t43 = #t41 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).baz = 42;
-  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{core::Null?} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
+  let final Never #t44 = let final Never #t45 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t44.{core::Object::==}(null) ?{Null} null : let final Never #t46 = (let final Never #t47 = #t44 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[](42) in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.");
   let final Never #t48 = let final Never #t49 = x in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.") in #t48.{core::Object::==}(null) ?{core::int?} null : (let final Never #t50 = #t48 in throw new _in::ReachabilityError::•("`null` encountered as the result from expression with type `Never`.")).[]=(42, 42);
   invalid-expression "pkg/front_end/testcases/nnbd/never_receiver.dart:30:5: Error: The method 'foo' isn't defined for the class 'Never?'.
 Try correcting the name to the name of an existing method, or defining a method named 'foo'.
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
index 296454f..03d3614 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.outline.expect
@@ -55,7 +55,7 @@
   generic-covariant-impl field self::C::X? fieldOfX;
   field core::int? fieldOfX2;
   field dynamic fieldOfX3;
-  field core::Null? fieldOfX4;
+  field Null fieldOfX4;
   field () →? core::int fieldOfX5;
   generic-covariant-impl field self::C::Y? fieldOfX6;
   late static field core::int lateStaticFieldOfC;
@@ -74,7 +74,7 @@
   generic-covariant-impl field self::L::X? fieldOfL;
   field core::int? fieldOfL2;
   field dynamic fieldOfL3;
-  field core::Null? fieldOfL4;
+  field Null fieldOfL4;
   field () →? core::int fieldOfL5;
   generic-covariant-impl field self::L::Y? fieldOfL6;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.strong.transformed.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
index 344ba8c..e9ee16a 100644
--- a/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/non_nullable_field_initialization.dart.weak.transformed.expect
@@ -93,7 +93,7 @@
   generic-covariant-impl field self::C::X? fieldOfX = null;
   field core::int? fieldOfX2 = null;
   field dynamic fieldOfX3 = null;
-  field core::Null? fieldOfX4 = null;
+  field Null fieldOfX4 = null;
   field () →? core::int fieldOfX5 = null;
   generic-covariant-impl field self::C::Y? fieldOfX6 = null;
   late static field core::int lateStaticFieldOfC;
@@ -114,7 +114,7 @@
   generic-covariant-impl field self::L::X? fieldOfL = null;
   field core::int? fieldOfL2 = null;
   field dynamic fieldOfL3 = null;
-  field core::Null? fieldOfL4 = null;
+  field Null fieldOfL4 = null;
   field () →? core::int fieldOfL5 = null;
   generic-covariant-impl field self::L::Y? fieldOfL6 = null;
   late static field core::int lateStaticFieldOfM;
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.strong.transformed.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
index 81553c6..56259bd 100644
--- a/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/not_definitely_unassigned_late_local_variables.dart.weak.transformed.expect
@@ -12,11 +12,11 @@
   method foo() → dynamic {
     late self::A::T% value;
     late core::int intValue;
-    () → core::Null? result = () → core::Null? {
+    () → Null result = () → Null {
       this.{self::A::bar}(value);
       this.{self::A::barInt}(intValue);
     };
-    (() → core::Null? {
+    (() → Null {
       value = this.{self::A::baz}();
       intValue = 42;
     }).call();
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
index f1b5ac6..6aaebca 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.outline.expect
@@ -6,14 +6,14 @@
   synthetic constructor •() → self::A<self::A::X%>
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     ;
 }
 class C extends core::Object {
   synthetic constructor •() → self::C
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     ;
 }
 static method foo() → dynamic
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
index a19cb5b..b1e0890 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
index a19cb5b..b1e0890 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
index 7efdb66..82c9494 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>*>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
index 7efdb66..82c9494 100644
--- a/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_null.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
     : super core::Object::•()
     ;
 }
-class B extends self::A<core::Null?> {
+class B extends self::A<Null> {
   synthetic constructor •() → self::B
     : super self::A::•()
     ;
@@ -16,18 +16,18 @@
   synthetic constructor •() → self::C
     : super core::Object::•()
     ;
-  method foo(core::Null? n, self::A<core::Null?> an) → core::Null?
+  method foo(Null n, self::A<Null> an) → Null
     return n;
 }
 static method foo() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[<core::Null?>[], <self::A<core::Null?>>[]];
+  return <core::List<self::A<Null>?>>[<Null>[], <self::A<Null>>[]];
 }
 static method bar() → dynamic {
-  return <core::List<self::A<core::Null?>?>>[#C1, #C2];
+  return <core::List<self::A<Null>?>>[#C1, #C2];
 }
 static method main() → dynamic {}
 
 constants  {
-  #C1 = <core::Null?>[]
-  #C2 = <self::A<core::Null?>*>[]
+  #C1 = <Null>[]
+  #C2 = <self::A<Null>*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
index e0909e0..c104f5c 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.strong.expect
@@ -417,7 +417,7 @@
 
 class Class extends core::Object {
   field core::int property = 0;
-  field core::Function functionField = () → core::Null? {};
+  field core::Function functionField = () → Null {};
   field () → void functionTypeField = () → void {};
   synthetic constructor •() → self::Class
     : super core::Object::•()
@@ -425,7 +425,7 @@
   method method() → core::int
     return 0;
   get functionGetter() → core::Function
-    return () → core::Null? {};
+    return () → Null {};
   get functionTypeGetter() → () → void
     return () → void {};
 }
@@ -636,11 +636,11 @@
 static method Extension|get#extensionMethod(final self::Class #this) → () → core::int
   return () → core::int => self::Extension|extensionMethod(#this);
 static method Extension|get#extensionFunctionGetter(final self::Class #this) → core::Function
-  return () → core::Null? {};
+  return () → Null {};
 static method Extension|get#extensionFunctionTypeGetter(final self::Class #this) → () → void
   return () → void {};
 static get nullableFunction() → core::Function?
-  return () → core::Null? {};
+  return () → Null {};
 static get nullableFunctionType() → () →? void
   return () → void {};
 static get nullableInt() → core::int?
diff --git a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
index e0909e0..c104f5c 100644
--- a/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/potentially_nullable_access.dart.weak.expect
@@ -417,7 +417,7 @@
 
 class Class extends core::Object {
   field core::int property = 0;
-  field core::Function functionField = () → core::Null? {};
+  field core::Function functionField = () → Null {};
   field () → void functionTypeField = () → void {};
   synthetic constructor •() → self::Class
     : super core::Object::•()
@@ -425,7 +425,7 @@
   method method() → core::int
     return 0;
   get functionGetter() → core::Function
-    return () → core::Null? {};
+    return () → Null {};
   get functionTypeGetter() → () → void
     return () → void {};
 }
@@ -636,11 +636,11 @@
 static method Extension|get#extensionMethod(final self::Class #this) → () → core::int
   return () → core::int => self::Extension|extensionMethod(#this);
 static method Extension|get#extensionFunctionGetter(final self::Class #this) → core::Function
-  return () → core::Null? {};
+  return () → Null {};
 static method Extension|get#extensionFunctionTypeGetter(final self::Class #this) → () → void
   return () → void {};
 static get nullableFunction() → core::Function?
-  return () → core::Null? {};
+  return () → Null {};
 static get nullableFunctionType() → () →? void
   return () → void {};
 static get nullableInt() → core::int?
diff --git a/pkg/front_end/testcases/nnbd/required.dart.strong.expect b/pkg/front_end/testcases/nnbd/required.dart.strong.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.strong.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.strong.transformed.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
index ed0ee8e..55eb694 100644
--- a/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/required.dart.weak.transformed.expect
@@ -74,23 +74,23 @@
     ;
   method foo({core::int x = #C1}) → dynamic {}
 }
-static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+static field ({a: core::int, required b: core::int}) → dynamic field = ({core::int a = #C1, required core::int b = #C2}) → Null {};
 static method method({core::int a = #C1, required core::int b = #C2, required final core::int c = #C2}) → dynamic {}
 static method ok() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C1, required core::int b = #C2}) → void {}
-  f = ({core::int a = #C1, required core::int b = #C2}) → core::Null? {};
+  f = ({core::int a = #C1, required core::int b = #C2}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a, [core::int b = #C1]) → void {}
-  f2 = (core::int a, [core::int b = #C1]) → core::Null? {};
+  f2 = (core::int a, [core::int b = #C1]) → Null {};
 }
 static method error() → dynamic {
   ({a: core::int, required b: core::int}) → dynamic f;
   function g({core::int a = #C2, required core::int b = #C1}) → void {}
-  f = ({core::int a = #C2, required core::int b = #C1}) → core::Null? {};
+  f = ({core::int a = #C2, required core::int b = #C1}) → Null {};
   (core::int, [core::int]) → dynamic f2;
   function g2(core::int a = #C1, [core::int b = #C2]) → void {}
-  f2 = (core::int a = #C1, [core::int b = #C2]) → core::Null? {};
+  f2 = (core::int a = #C1, [core::int b = #C2]) → Null {};
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
index 04bbfb6..2c50b42 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.strong.expect
@@ -22,7 +22,7 @@
 }
 static method customErrorZone() → asy::Future<void> async {
   final asy::Completer<void> completer = asy::Completer::•<void>();
-  asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> async {
+  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async {
     await self::allYield();
     completer.{asy::Completer::complete}(null);
   }, (core::Object e, core::StackTrace s) → void {
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
index c130478..8c64d78 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.strong.transformed.expect
@@ -118,10 +118,10 @@
       #L4:
       {
         final asy::Completer<void> completer = asy::Completer::•<void>();
-        asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> /* originally async */ {
-          final asy::_Future<core::Null?> :async_future = new asy::_Future::•<core::Null?>();
+        asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> /* originally async */ {
+          final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
           core::bool* :is_sync = false;
-          FutureOr<core::Null?>? :return_value;
+          FutureOr<Null>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
index 04bbfb6..2c50b42 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.weak.expect
@@ -22,7 +22,7 @@
 }
 static method customErrorZone() → asy::Future<void> async {
   final asy::Completer<void> completer = asy::Completer::•<void>();
-  asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> async {
+  asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> async {
     await self::allYield();
     completer.{asy::Completer::complete}(null);
   }, (core::Object e, core::StackTrace s) → void {
diff --git a/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
index c130478..8c64d78 100644
--- a/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_async.dart.weak.transformed.expect
@@ -118,10 +118,10 @@
       #L4:
       {
         final asy::Completer<void> completer = asy::Completer::•<void>();
-        asy::runZonedGuarded<asy::Future<core::Null?>>(() → asy::Future<core::Null?> /* originally async */ {
-          final asy::_Future<core::Null?> :async_future = new asy::_Future::•<core::Null?>();
+        asy::runZonedGuarded<asy::Future<Null>>(() → asy::Future<Null> /* originally async */ {
+          final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
           core::bool* :is_sync = false;
-          FutureOr<core::Null?>? :return_value;
+          FutureOr<Null>? :return_value;
           dynamic :async_stack_trace;
           (dynamic) → dynamic :async_op_then;
           (core::Object, core::StackTrace) → dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
index e6382ed..05a001d 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.expect
@@ -170,7 +170,7 @@
   ^" in null;
   }
   function returnAsync4() → FutureOr<core::int?> async {}
-  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync5() → asy::Future<Null> async {}
   function returnAsync6() → asy::Future<core::int?> async {
     return null;
   }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
index 35e4ddc..08d3990 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.strong.transformed.expect
@@ -80,14 +80,14 @@
   core::print("foo");
   return let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:13:10: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
   return null; // error
-         ^" in let core::Null? #t3 = null in #t3.==(null) ?{core::String} #t3 as{TypeError,ForNonNullableByDefault} core::String : #t3{core::String};
+         ^" in let Null #t3 = null in #t3.==(null) ?{core::String} #t3 as{TypeError,ForNonNullableByDefault} core::String : #t3{core::String};
 }
 static method returnMixed(core::bool b) → core::String {
   if(b) {
     core::print("foo");
     return let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:19:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
-           ^" in let core::Null? #t5 = null in #t5.==(null) ?{core::String} #t5 as{TypeError,ForNonNullableByDefault} core::String : #t5{core::String};
+           ^" in let Null #t5 = null in #t5.==(null) ?{core::String} #t5 as{TypeError,ForNonNullableByDefault} core::String : #t5{core::String};
   }
   return let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:16:8: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
 String returnMixed(bool b) /*error*/ {
@@ -364,14 +364,14 @@
     core::print("foo");
     return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:69:12: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
     return null; // error
-           ^" in let core::Null? #t11 = null in #t11.==(null) ?{core::String} #t11 as{TypeError,ForNonNullableByDefault} core::String : #t11{core::String};
+           ^" in let Null #t11 = null in #t11.==(null) ?{core::String} #t11 as{TypeError,ForNonNullableByDefault} core::String : #t11{core::String};
   }
   function returnMixed(core::bool b) → core::String {
     if(b) {
       core::print("foo");
       return let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:75:14: Error: A value of type 'Null' can't be returned from a function with return type 'String' because 'Null' is nullable and 'String' isn't.
       return null; // error
-             ^" in let core::Null? #t13 = null in #t13.==(null) ?{core::String} #t13 as{TypeError,ForNonNullableByDefault} core::String : #t13{core::String};
+             ^" in let Null #t13 = null in #t13.==(null) ?{core::String} #t13 as{TypeError,ForNonNullableByDefault} core::String : #t13{core::String};
     }
     return let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/nnbd/return_null.dart:72:3: Error: A non-null value must be returned since the return type 'String' doesn't allow null.
   String returnMixed(bool b) /* error */ {
@@ -486,10 +486,10 @@
     :is_sync = true;
     return :async_future;
   }
-  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
-    final asy::_Future<core::Null?> :async_future = new asy::_Future::•<core::Null?>();
+  function returnAsync5() → asy::Future<Null> /* originally async */ {
+    final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
     core::bool* :is_sync = false;
-    FutureOr<core::Null?>? :return_value;
+    FutureOr<Null>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
     (core::Object, core::StackTrace) → dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
index 4c3a28a..75aa5e4 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.expect
@@ -174,7 +174,7 @@
   ^" in null;
   }
   function returnAsync4() → FutureOr<core::int?> async {}
-  function returnAsync5() → asy::Future<core::Null?> async {}
+  function returnAsync5() → asy::Future<Null> async {}
   function returnAsync6() → asy::Future<core::int?> async {
     return null;
   }
diff --git a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
index 0a2d547..39f41e3 100644
--- a/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/return_null.dart.weak.transformed.expect
@@ -490,10 +490,10 @@
     :is_sync = true;
     return :async_future;
   }
-  function returnAsync5() → asy::Future<core::Null?> /* originally async */ {
-    final asy::_Future<core::Null?> :async_future = new asy::_Future::•<core::Null?>();
+  function returnAsync5() → asy::Future<Null> /* originally async */ {
+    final asy::_Future<Null> :async_future = new asy::_Future::•<Null>();
     core::bool* :is_sync = false;
-    FutureOr<core::Null?>? :return_value;
+    FutureOr<Null>? :return_value;
     dynamic :async_stack_trace;
     (dynamic) → dynamic :async_op_then;
     (core::Object, core::StackTrace) → dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
index 9810989..2e91168 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.expect
@@ -82,7 +82,7 @@
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
index 9962d29..6fba66e 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.strong.transformed.expect
@@ -82,7 +82,7 @@
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
index 9810989..2e91168 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.expect
@@ -82,7 +82,7 @@
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
index 9962d29..6fba66e 100644
--- a/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/shorting_stop.dart.weak.transformed.expect
@@ -82,7 +82,7 @@
                        ^" in (let final self::Class? #t26 = c in #t26.{core::Object::==}(null) ?{core::int?} null : #t26{self::Class}.{self::Class::next}.{self::Class::[]}(0)).{core::int::unary-}());
 }
 static method _inStrongMode() → core::bool {
-  (core::String?) → core::Null? f = (core::String? s) → core::Null? {
+  (core::String?) → Null f = (core::String? s) → Null {
     let final<BottomType> #t27 = invalid-expression "pkg/front_end/testcases/nnbd/shorting_stop.dart:36:7: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null.
 Try accessing using ?. instead.
     s.length; // This will be an invalid expression in strong mode.
diff --git a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
index c7475f1..23c8814 100644
--- a/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart.strong.transformed.expect
@@ -57,7 +57,7 @@
 static method foo<T extends self::C? = self::C?>(self::C? c, self::foo::T% t, self::foo::T? nt) → dynamic {
   self::functionContext(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:14:24: Error: Can't tear off method 'call' from a potentially null value.
   functionContext(null as C?); // Error.
-                       ^" in let core::Null? #t2 = null in #t2.==(null) ?{() → core::int} #t2 as{TypeError} () → core::int : #t2{() → core::int});
+                       ^" in let Null #t2 = null in #t2.==(null) ?{() → core::int} #t2 as{TypeError} () → core::int : #t2{() → core::int});
   self::nullableFunctionContext(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd/tearoff_from_nullable_receiver.dart:15:32: Error: Can't tear off method 'call' from a potentially null value.
   nullableFunctionContext(null as C?); // Error.
                                ^" in null);
diff --git a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
index 211652e..64936bf 100644
--- a/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/type_constraint_solving_closures_in_upper_and_lower_bounds.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
     ;
 }
 static method check<T extends core::Object? = dynamic>(self::C<core::List<self::check::T%>> f) → self::check::T% {
-  return let core::Null? #t1 = null in #t1.==(null) ?{self::check::T%} #t1 as{ForNonNullableByDefault} self::check::T% : #t1{self::check::T%};
+  return let Null #t1 = null in #t1.==(null) ?{self::check::T%} #t1 as{ForNonNullableByDefault} self::check::T% : #t1{self::check::T%};
 }
 static method test() → void {
   core::int x = self::check<core::int>(new self::C::•<core::List<core::int>>((core::List<core::int> x) → void {}));
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
index 364e1c1..f315bb6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.expect
@@ -1,15 +1,15 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "bounds_from_opt_in_lib.dart" as bou;
+import "dart:core" as core;
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends core::Null? = core::Null?> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends core::Null? = core::Null?>() → dynamic {}
+  method method<T extends Null = Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,9 +22,9 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  bou::Class<core::Null?>* c = new bou::Class::•<core::Null?>();
-  c.{bou::Class::method}<core::Null?>();
-  bou::method<core::Null?>();
+  bou::Class<Null>* c = new bou::Class::•<Null>();
+  c.{bou::Class::method}<Null>();
+  bou::method<Null>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
index 364e1c1..f315bb6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/bounds_from_opt_in.dart.weak.transformed.expect
@@ -1,15 +1,15 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "bounds_from_opt_in_lib.dart" as bou;
+import "dart:core" as core;
 
 import "org-dartlang-testcase:///bounds_from_opt_in_lib.dart";
 
-class LegacyClass<T extends core::Null? = core::Null?> extends bou::Class<self::LegacyClass::T*> {
+class LegacyClass<T extends Null = Null> extends bou::Class<self::LegacyClass::T*> {
   synthetic constructor •() → self::LegacyClass<self::LegacyClass::T*>*
     : super bou::Class::•()
     ;
-  method method<T extends core::Null? = core::Null?>() → dynamic {}
+  method method<T extends Null = Null>() → dynamic {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -22,9 +22,9 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method test() → dynamic {
-  bou::Class<core::Null?>* c = new bou::Class::•<core::Null?>();
-  c.{bou::Class::method}<core::Null?>();
-  bou::method<core::Null?>();
+  bou::Class<Null>* c = new bou::Class::•<Null>();
+  c.{bou::Class::method}<Null>();
+  bou::method<Null>();
 }
 static method main() → dynamic {}
 
diff --git a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
index 3725acd..496eb80 100644
--- a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.expect
@@ -29,11 +29,11 @@
 import self as cal;
 import "dart:core" as core;
 
-static method takesNull(core::Null? n) → void {}
+static method takesNull(Null n) → void {}
 static method takesNever(Never n) → void {}
-static method applyTakesNull((core::Null?) → void f) → dynamic {}
+static method applyTakesNull((Null) → void f) → dynamic {}
 static method applyTakesNever((Never) → void f) → dynamic {}
-static method applyTakesNullNamed({required (core::Null?) → void f = #C5}) → dynamic {}
+static method applyTakesNullNamed({required (Null) → void f = #C5}) → dynamic {}
 static method applyTakesNeverNamed({required (Never) → void f = #C5}) → dynamic {}
 static method takesNullable(core::int? i) → void {}
 static method takesNonNullable(core::int i) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
index 3725acd..496eb80 100644
--- a/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/call_opt_in_through_opt_out.dart.weak.transformed.expect
@@ -29,11 +29,11 @@
 import self as cal;
 import "dart:core" as core;
 
-static method takesNull(core::Null? n) → void {}
+static method takesNull(Null n) → void {}
 static method takesNever(Never n) → void {}
-static method applyTakesNull((core::Null?) → void f) → dynamic {}
+static method applyTakesNull((Null) → void f) → dynamic {}
 static method applyTakesNever((Never) → void f) → dynamic {}
-static method applyTakesNullNamed({required (core::Null?) → void f = #C5}) → dynamic {}
+static method applyTakesNullNamed({required (Null) → void f = #C5}) → dynamic {}
 static method applyTakesNeverNamed({required (Never) → void f = #C5}) → dynamic {}
 static method takesNullable(core::int? i) → void {}
 static method takesNonNullable(core::int i) → void {}
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
index a139d60..bdcfe75 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.expect
@@ -23,7 +23,7 @@
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
 static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
   return null;
-static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+static method fnWithNullBound<T extends Null = Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
index 9c0d806..a2670ba 100644
--- a/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/const_is.dart.weak.transformed.expect
@@ -23,7 +23,7 @@
 typedef fnTypeWithNeverBound = <T extends Never = dynamic>() → void;
 static method fnWithNonNullObjectBound<T extends core::Object = core::Object>() → void
   return null;
-static method fnWithNullBound<T extends core::Null? = core::Null?>() → void
+static method fnWithNullBound<T extends Null = Null>() → void
   return null;
 
 constants  {
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
index 2a5dc83..470c9c8 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.expect
@@ -37,45 +37,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
   con::test();
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
@@ -94,32 +94,32 @@
 static const field core::bool* d0 = #C3;
 static const field core::bool* d1 = #C2;
 static const field self::Class<core::int*>* d4 = #C4;
-static const field self::Class<core::Null?>* d5 = #C5;
+static const field self::Class<Null>* d5 = #C5;
 static const field self::Class<core::int*>* d6 = #C6;
-static const field self::Class<core::Null?>* d7 = #C5;
+static const field self::Class<Null>* d7 = #C5;
 static const field self::Class<core::int*>* d8 = #C4;
-static const field self::Class<core::Null?>* d9 = #C7;
+static const field self::Class<Null>* d9 = #C7;
 static const field self::Class<core::int*>* d10 = #C6;
-static const field self::Class<core::Null?>* d11 = #C5;
+static const field self::Class<Null>* d11 = #C5;
 static method test() → dynamic {
   self::expect(null is core::int*, #C3, "null is int (opt-out)");
-  self::expect(null is core::Null?, #C2, "null is Null");
+  self::expect(null is Null, #C2, "null is Null");
   self::expect(new self::Class::constructor1<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field (opt-out)");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
   self::expect(new self::Class::constructor2<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field (opt-out)");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
   self::expect(new self::Class::constructor3<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field (opt-out)");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
   self::expect(new self::Class::constructor4<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field (opt-out)");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
index 439da59..dc41d03 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constant_null_is.dart.weak.transformed.expect
@@ -37,45 +37,45 @@
 static const field core::bool c12 = #C2;
 static const field self::Class<core::int> e1 = #C4;
 static const field self::Class<core::int?> e2 = #C4;
-static const field self::Class<core::Null?> e3 = #C5;
+static const field self::Class<Null> e3 = #C5;
 static const field self::Class<core::int> e4 = #C6;
 static const field self::Class<core::int?> e5 = #C6;
-static const field self::Class<core::Null?> e6 = #C5;
+static const field self::Class<Null> e6 = #C5;
 static const field self::Class<core::int> e7 = #C4;
 static const field self::Class<core::int?> e8 = #C4;
-static const field self::Class<core::Null?> e9 = #C7;
+static const field self::Class<Null> e9 = #C7;
 static const field self::Class<core::int> e10 = #C6;
 static const field self::Class<core::int?> e11 = #C6;
-static const field self::Class<core::Null?> e12 = #C5;
+static const field self::Class<Null> e12 = #C5;
 static method main() → dynamic {
   self::expect(null is{ForNonNullableByDefault} core::int?, #C2, "null is int?");
   self::expect(null is{ForNonNullableByDefault} core::int, #C3, "null is int");
-  self::expect(null is{ForNonNullableByDefault} core::Null?, #C2, "null is Null");
+  self::expect(null is{ForNonNullableByDefault} Null, #C2, "null is Null");
   self::expect(null is{ForNonNullableByDefault} Never?, #C2, "null is Never?");
   self::expect(null is{ForNonNullableByDefault} Never, #C3, "null is Never");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int?>, #C2, "null is FutureOr<int?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>, #C3, "null is FutureOr<int>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<core::int>?, #C2, "null is FutureOr<int>?");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>, #C2, "null is FutureOr<Null>");
-  self::expect(null is{ForNonNullableByDefault} FutureOr<core::Null?>?, #C2, "null is FutureOr<Null>?");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>, #C2, "null is FutureOr<Null>");
+  self::expect(null is{ForNonNullableByDefault} FutureOr<Null>?, #C2, "null is FutureOr<Null>?");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>, #C3, "null is FutureOr<Never>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never?>, #C2, "null is FutureOr<Never?>");
   self::expect(null is{ForNonNullableByDefault} FutureOr<Never>?, #C2, "null is FutureOr<Never>?");
   self::expect(new self::Class::constructor1<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field");
   self::expect(true, new self::Class::constructor1<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor1(null).field");
   self::expect(!self::isWeakMode, (#C4).{self::Class::field}, "const Class<int?>.constructor1(null).field");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field");
   self::expect(new self::Class::constructor2<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field");
   self::expect(true, new self::Class::constructor2<core::int?>(null).{self::Class::field}, "new Class<int?>.constructor2(null).field");
   self::expect(new self::Class::constructor2<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor2(null).field");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field");
   self::expect(new self::Class::constructor3<core::int>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
   self::expect(new self::Class::constructor3<core::int?>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int?>.constructor3(null).field");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field");
   self::expect(new self::Class::constructor4<core::int>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field");
   self::expect(new self::Class::constructor4<core::int?>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int?>.constructor4(null).field");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field");
   con::test();
 }
 static method expect(dynamic expected, dynamic actual, core::String message) → dynamic {
@@ -94,34 +94,34 @@
 static const field core::bool* d0 = #C3;
 static const field core::bool* d1 = #C2;
 static const field self::Class<core::int*>* d4 = #C4;
-static const field self::Class<core::Null?>* d5 = #C5;
+static const field self::Class<Null>* d5 = #C5;
 static const field self::Class<core::int*>* d6 = #C6;
-static const field self::Class<core::Null?>* d7 = #C5;
+static const field self::Class<Null>* d7 = #C5;
 static const field self::Class<core::int*>* d8 = #C4;
-static const field self::Class<core::Null?>* d9 = #C7;
+static const field self::Class<Null>* d9 = #C7;
 static const field self::Class<core::int*>* d10 = #C6;
-static const field self::Class<core::Null?>* d11 = #C5;
+static const field self::Class<Null>* d11 = #C5;
 static method test() → dynamic {
   self::expect(null is core::int*, #C3, "null is int (opt-out)");
-  self::expect(null is core::Null?, #C2, "null is Null");
+  self::expect(null is Null, #C2, "null is Null");
   self::expect(new self::Class::constructor1<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor1(null).field (opt-out)");
-  self::expect(new self::Class::constructor1<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
+  self::expect(new self::Class::constructor1<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor1(null).field (opt-out)");
   self::expect(new self::Class::constructor2<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor2(null).field (opt-out)");
-  self::expect(new self::Class::constructor2<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
+  self::expect(new self::Class::constructor2<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor2(null).field (opt-out)");
   self::expect(new self::Class::constructor3<core::int*>(null).{self::Class::field}, (#C4).{self::Class::field}, "Class<int>.constructor3(null).field (opt-out)");
-  self::expect(new self::Class::constructor3<core::Null?>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
+  self::expect(new self::Class::constructor3<Null>(null).{self::Class::field}, (#C7).{self::Class::field}, "Class<Null>.constructor3(null).field (opt-out)");
   self::expect(new self::Class::constructor4<core::int*>(null).{self::Class::field}, (#C6).{self::Class::field}, "Class<int>.constructor4(null).field (opt-out)");
-  self::expect(new self::Class::constructor4<core::Null?>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
+  self::expect(new self::Class::constructor4<Null>(null).{self::Class::field}, (#C5).{self::Class::field}, "Class<Null>.constructor4(null).field (opt-out)");
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = false
   #C4 = self::Class<core::int*> {field:#C3}
-  #C5 = self::Class<core::Null?> {field:#C2}
+  #C5 = self::Class<Null> {field:#C2}
   #C6 = self::Class<core::int*> {field:#C2}
-  #C7 = self::Class<core::Null?> {field:#C3}
+  #C7 = self::Class<Null> {field:#C3}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
index e324019..0124126 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.expect
@@ -88,7 +88,7 @@
   #C5 = <core::int*>[#C3]
   #C6 = null
   #C7 = <dynamic>[#C3, #C6]
-  #C8 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C7}
   #C9 = col::_UnmodifiableSet<core::int*> {_map:#C8}
   #C10 = "foo"
   #C11 = <dynamic>[#C3, #C10]
diff --git a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
index e324019..0124126 100644
--- a/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/constants.dart.weak.transformed.expect
@@ -88,7 +88,7 @@
   #C5 = <core::int*>[#C3]
   #C6 = null
   #C7 = <dynamic>[#C3, #C6]
-  #C8 = core::_ImmutableMap<core::int*, core::Null?> {_kvPairs:#C7}
+  #C8 = core::_ImmutableMap<core::int*, Null> {_kvPairs:#C7}
   #C9 = col::_UnmodifiableSet<core::int*> {_map:#C8}
   #C10 = "foo"
   #C11 = <dynamic>[#C3, #C10]
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
index a342956..94c1a96 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.expect
@@ -34,7 +34,7 @@
   core::List<inf::C<core::int*>*>* local1f = <inf::C<core::int*>*>[inf::field6];
   core::List<core::int*>* local1g = <core::int*>[inf::field7];
   core::List<core::int*>* local1h = <core::int*>[inf::field8];
-  core::List<core::Null?>* local1i = <core::Null?>[null];
+  core::List<Null>* local1i = <Null>[null];
   core::Set<inf::C<dynamic>*>* local2a = block {
     final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>();
     #t1.{core::Set::add}(inf::field1);
@@ -164,7 +164,7 @@
   core::List<inf::C<core::int?>?> local1f = <inf::C<core::int?>?>[inf::field6];
   core::List<core::int> local1g = <core::int>[inf::field7];
   core::List<core::int?> local1h = <core::int?>[inf::field8];
-  core::List<core::Null?> local1i = <core::Null?>[null];
+  core::List<Null> local1i = <Null>[null];
   core::Set<inf::C<dynamic>?> local2a = block {
     final core::Set<inf::C<dynamic>?> #t17 = col::LinkedHashSet::•<inf::C<dynamic>?>();
     #t17.{core::Set::add}(inf::field1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
index 3eb5671..8c3ed7b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/infer_constraints_from_opt_in.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
   core::List<inf::C<core::int*>*>* local1f = <inf::C<core::int*>*>[inf::field6];
   core::List<core::int*>* local1g = <core::int*>[inf::field7];
   core::List<core::int*>* local1h = <core::int*>[inf::field8];
-  core::List<core::Null?>* local1i = <core::Null?>[null];
+  core::List<Null>* local1i = <Null>[null];
   core::Set<inf::C<dynamic>*>* local2a = block {
     final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>();
     #t1.{core::Set::add}(inf::field1);
@@ -164,7 +164,7 @@
   core::List<inf::C<core::int?>?> local1f = <inf::C<core::int?>?>[inf::field6];
   core::List<core::int> local1g = <core::int>[inf::field7];
   core::List<core::int?> local1h = <core::int?>[inf::field8];
-  core::List<core::Null?> local1i = <core::Null?>[null];
+  core::List<Null> local1i = <Null>[null];
   core::Set<inf::C<dynamic>?> local2a = block {
     final core::Set<inf::C<dynamic>?> #t17 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>();
     #t17.{core::Set::add}(inf::field1);
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
index 1a52e64..615c4e4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   method method() → iss::C<self::D::Y*>*
-    return new iss::C::•<self::D::Y*>(() → core::Null? => null);
+    return new iss::C::•<self::D::Y*>(() → Null => null);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -23,13 +23,13 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void {
-  iss::foo(() → core::Null? => null);
+  iss::foo(() → Null => null);
   iss::bar = () → iss::Map<core::String*, core::String*>* => null;
   new self::D::•<core::int*>().{self::D::method}();
   self::findKey(new iss::Map::•<core::String*, core::String*>("foo", "bar"), "bar");
 }
 static method findKey(iss::Map<core::String*, dynamic>* m, dynamic search) → void {
-  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → core::Null? => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
+  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → Null => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
index 1a52e64..615c4e4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41180.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
     : super core::Object::•()
     ;
   method method() → iss::C<self::D::Y*>*
-    return new iss::C::•<self::D::Y*>(() → core::Null? => null);
+    return new iss::C::•<self::D::Y*>(() → Null => null);
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -23,13 +23,13 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method main() → void {
-  iss::foo(() → core::Null? => null);
+  iss::foo(() → Null => null);
   iss::bar = () → iss::Map<core::String*, core::String*>* => null;
   new self::D::•<core::int*>().{self::D::method}();
   self::findKey(new iss::Map::•<core::String*, core::String*>("foo", "bar"), "bar");
 }
 static method findKey(iss::Map<core::String*, dynamic>* m, dynamic search) → void {
-  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → core::Null? => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
+  core::print(let final core::MapEntry<core::String*, dynamic>* #t1 = m.{iss::Map::entries}.{iss::Iterable::singleWhere}((core::MapEntry<core::String*, dynamic>* entry) → core::bool* => entry.{core::MapEntry::value}.{core::Object::==}(search), orElse: () → Null => null) in #t1.{core::Object::==}(null) ?{core::String*} null : #t1.{core::MapEntry::key});
 }
 
 library /*isNonNullableByDefault*/;
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
index 2f840e9..bcfdbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.expect
@@ -1,18 +1,17 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "issue41435_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue41435_lib.dart";
 
 static method main() → void {
-  core::Null? nil;
+  Null nil;
   iss::x = null;
   iss::x = nil;
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (core::Null? x) → core::Null? {};
+  iss::f = (Null x) → Null {};
 }
 
 library /*isNonNullableByDefault*/;
@@ -20,9 +19,9 @@
 import "dart:core" as core;
 
 static field Never x = throw "Unreachable";
-static field (core::Null?) → void f = (core::Object? n) → void {};
+static field (Null) → void f = (core::Object? n) → void {};
 static method takesNever(Never x) → void {}
-static method takesTakesNull((core::Null?) → void f) → void {}
+static method takesTakesNull((Null) → void f) → void {}
 
 constants  {
   #C1 = tearoff iss::takesNever
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
index 2f840e9..bcfdbf4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41435.dart.weak.transformed.expect
@@ -1,18 +1,17 @@
 library;
 import self as self;
-import "dart:core" as core;
 import "issue41435_lib.dart" as iss;
 
 import "org-dartlang-testcase:///issue41435_lib.dart";
 
 static method main() → void {
-  core::Null? nil;
+  Null nil;
   iss::x = null;
   iss::x = nil;
   iss::takesNever(null);
   iss::takesNever(nil);
   iss::takesTakesNull(#C1);
-  iss::f = (core::Null? x) → core::Null? {};
+  iss::f = (Null x) → Null {};
 }
 
 library /*isNonNullableByDefault*/;
@@ -20,9 +19,9 @@
 import "dart:core" as core;
 
 static field Never x = throw "Unreachable";
-static field (core::Null?) → void f = (core::Object? n) → void {};
+static field (Null) → void f = (core::Object? n) → void {};
 static method takesNever(Never x) → void {}
-static method takesTakesNull((core::Null?) → void f) → void {}
+static method takesTakesNull((Null) → void f) → void {}
 
 constants  {
   #C1 = tearoff iss::takesNever
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
index e78db51..280af56 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.expect
@@ -45,7 +45,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
@@ -87,7 +87,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
index e78db51..280af56 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498.dart.weak.transformed.expect
@@ -45,7 +45,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
@@ -87,7 +87,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
index aaa6b94..a230610b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.expect
@@ -32,7 +32,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
@@ -90,7 +90,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
index aaa6b94..a230610b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41498b.dart.weak.transformed.expect
@@ -32,7 +32,7 @@
 static method test() → dynamic {
   () →* void f;
   f.{core::Object::toString}();
-  core::Function* foo = () → core::Null? {
+  core::Function* foo = () → Null {
     () →* void f;
     f.{core::Object::toString}();
   };
@@ -90,7 +90,7 @@
   (let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:24:3: Error: Non-nullable variable 'f' must be assigned before it can be used.
   f.toString(); // error
   ^" in f).{core::Object::toString}();
-  core::Function foo = () → core::Null? {
+  core::Function foo = () → Null {
     () → void f;
     (let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/nnbd_mixed/issue41498b_lib.dart:29:5: Error: Non-nullable variable 'f' must be assigned before it can be used.
     f.toString(); // error
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
index 06afa9c..6654a73 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.expect
@@ -22,7 +22,7 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
index a19de51..9a8aafd 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue41657.dart.weak.transformed.expect
@@ -22,7 +22,7 @@
 }
 
 constants  {
-  #C1 = <core::Null?>[]
+  #C1 = <Null>[]
   #C2 = true
   #C3 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
index 0e74a72..3a9fde4 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.expect
@@ -28,9 +28,8 @@
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:async" as asy;
-import "dart:core" as core;
 
-typedef AsyncCallback = () → asy::Future<core::Null?>;
+typedef AsyncCallback = () → asy::Future<Null>;
 
 library /*isNonNullableByDefault*/;
 import self as fou;
@@ -43,7 +42,7 @@
   synthetic constructor •() → fou::BindingBase
     : super core::Object::•()
     ;
-  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<core::Null?> callback = #C1}) → void {}
+  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<Null> callback = #C1}) → void {}
 }
 
 library;
@@ -66,7 +65,7 @@
 import "org-dartlang-testcase:///foundation_lib.dart";
 
 abstract class SchedulerBinding extends fou::BindingBase /*isMixinDeclaration*/  {
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -111,7 +110,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
 }
 abstract class ServicesBinding extends ser::_ServicesBinding&BindingBase&SchedulerBinding /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
index 30fe040..75be828 100644
--- a/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/issue42387/scheduler_tester.dart.weak.transformed.expect
@@ -14,7 +14,7 @@
   synthetic constructor •() → self::_TestSchedulerBinding&BindingBase&SchedulerBinding*
     : super fou::BindingBase::•()
     ;
-  abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method /* from org-dartlang-testcase:///scheduler_binding_lib.dart */ _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -41,9 +41,8 @@
 library /*isNonNullableByDefault*/;
 import self as self2;
 import "dart:async" as asy;
-import "dart:core" as core;
 
-typedef AsyncCallback = () → asy::Future<core::Null?>;
+typedef AsyncCallback = () → asy::Future<Null>;
 
 library /*isNonNullableByDefault*/;
 import self as fou;
@@ -56,7 +55,7 @@
   synthetic constructor •() → fou::BindingBase
     : super core::Object::•()
     ;
-  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<core::Null?> callback = #C1}) → void {}
+  method registerSignalServiceExtension({required core::String name = #C1, required () → asy::Future<Null> callback = #C1}) → void {}
 }
 
 library;
@@ -79,7 +78,7 @@
 import "org-dartlang-testcase:///foundation_lib.dart";
 
 abstract class SchedulerBinding extends fou::BindingBase /*isMixinDeclaration*/  {
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -124,7 +123,7 @@
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<core::Null?>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
+  abstract member-signature method registerSignalServiceExtension({core::String* name = #C1, () →* asy::Future<Null>* callback = #C1}) → void; -> fou::BindingBase::registerSignalServiceExtension
 }
 abstract class ServicesBinding extends ser::_ServicesBinding&BindingBase&SchedulerBinding /*isMixinDeclaration*/  {
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
index 4852b17..ee003ce 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.expect
@@ -21,21 +21,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::B*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -48,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,16 +74,16 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::Null? optOutNever;
+static field Null optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
 static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
   nev::optInNever = self::optOutNever;
-  core::Type* typeNever = core::Null?;
-  self::genericMethod<core::Null?>();
-  new self::GenericClass::•<core::Null?>();
-  core::Null? localNever = null;
-  core::Null? localNull = null;
+  core::Type* typeNever = Null;
+  self::genericMethod<Null>();
+  new self::GenericClass::•<Null>();
+  Null localNever = null;
+  Null localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
   self::optOutNever = localNever;
@@ -109,29 +109,29 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
-  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Null;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
-  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = inferredLocalNever;
   inferredLocalNever = inferredLocalNever;
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => localNever = nev::throwing());
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
-  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
-  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
-  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
-  self::throws(() → core::Null? {
-    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => localNever = nev::throwing());
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => nev::optInNever = nev::throwing());
+  self::throws(() → Null => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → Null => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<Null>* boundedGenericClass = new nev::BoundedGenericClass::•<Null>();
+  self::throws(() → Null {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<Null>();
   });
-  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  core::List<Null>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<Null>();
   dynamic dyn = null;
   nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
@@ -154,7 +154,7 @@
 
 class A extends core::Object {
   field Never neverField = throw "Should not reach here";
-  field core::Null? nullField = null;
+  field Null nullField = null;
   synthetic constructor •() → nev::A
     : super core::Object::•()
     ;
@@ -163,11 +163,11 @@
   get neverProperty() → Never
     return throw "Should not reach here";
   set neverProperty(Never value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
 }
 class BoundedGenericClass<T extends Never = Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
diff --git a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
index 9428bc8..34765b6 100644
--- a/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/never_opt_out.dart.weak.transformed.expect
@@ -21,21 +21,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class B extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::B*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -48,21 +48,21 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 class C extends nev::A {
-  field core::Null? neverField = null;
-  field core::Null? nullField = null;
+  field Null neverField = null;
+  field Null nullField = null;
   synthetic constructor •() → self::C*
     : super nev::A::•()
     ;
-  method neverMethod(core::Null? value) → core::Null?
+  method neverMethod(Null value) → Null
     return value;
-  get neverProperty() → core::Null?
+  get neverProperty() → Null
     return null;
-  set neverProperty(core::Null? value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  set neverProperty(Null value) → void {}
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
   abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
   abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
@@ -74,16 +74,16 @@
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
-static field core::Null? optOutNever;
+static field Null optOutNever;
 static field dynamic inferredOptOutNever = nev::optInNever;
 static method genericMethod<T extends core::Object* = dynamic>() → dynamic {}
 static method main() → dynamic {
   nev::optInNever = self::optOutNever;
-  core::Type* typeNever = core::Null?;
-  self::genericMethod<core::Null?>();
-  new self::GenericClass::•<core::Null?>();
-  core::Null? localNever = null;
-  core::Null? localNull = null;
+  core::Type* typeNever = Null;
+  self::genericMethod<Null>();
+  new self::GenericClass::•<Null>();
+  Null localNever = null;
+  Null localNull = null;
   dynamic inferredLocalNever = nev::optInNever;
   localNever = localNever;
   self::optOutNever = localNever;
@@ -109,29 +109,29 @@
   localNull = localNull;
   self::inferredOptOutNever = localNull;
   inferredLocalNever = localNull;
-  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   nev::optInNever = self::inferredOptOutNever as{TypeError,ForDynamic} Never;
-  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} core::Null?;
+  localNull = self::inferredOptOutNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = self::inferredOptOutNever;
   inferredLocalNever = self::inferredOptOutNever;
-  localNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
-  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNever = inferredLocalNever as{TypeError,ForDynamic} Null;
+  self::optOutNever = inferredLocalNever as{TypeError,ForDynamic} Null;
   nev::optInNever = inferredLocalNever as{TypeError,ForDynamic} Never;
-  localNull = inferredLocalNever as{TypeError,ForDynamic} core::Null?;
+  localNull = inferredLocalNever as{TypeError,ForDynamic} Null;
   self::inferredOptOutNever = inferredLocalNever;
   inferredLocalNever = inferredLocalNever;
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => localNever = nev::throwing());
-  self::throws(() → core::Null? => self::optOutNever = nev::throwing());
-  self::throws(() → core::Null? => nev::optInNever = nev::throwing());
-  self::throws(() → core::Null? => self::inferredOptOutNever = nev::throwing());
-  self::throws(() → core::Null? => inferredLocalNever = nev::throwing());
-  nev::BoundedGenericClass<core::Null?>* boundedGenericClass = new nev::BoundedGenericClass::•<core::Null?>();
-  self::throws(() → core::Null? {
-    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<core::Null?>();
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => localNever = nev::throwing());
+  self::throws(() → Null => self::optOutNever = nev::throwing());
+  self::throws(() → Null => nev::optInNever = nev::throwing());
+  self::throws(() → Null => self::inferredOptOutNever = nev::throwing());
+  self::throws(() → Null => inferredLocalNever = nev::throwing());
+  nev::BoundedGenericClass<Null>* boundedGenericClass = new nev::BoundedGenericClass::•<Null>();
+  self::throws(() → Null {
+    dynamic boundedGenericMethodResult1 = nev::boundedGenericMethod1<Null>();
   });
-  core::List<core::Null?>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<core::Null?>();
+  core::List<Null>* boundedGenericMethodResult2 = nev::boundedGenericMethod2<Null>();
   dynamic dyn = null;
   nev::optInNever = dyn as{TypeError,ForDynamic} Never;
 }
@@ -154,7 +154,7 @@
 
 class A extends core::Object {
   field Never neverField = throw "Should not reach here";
-  field core::Null? nullField = null;
+  field Null nullField = null;
   synthetic constructor •() → nev::A
     : super core::Object::•()
     ;
@@ -163,11 +163,11 @@
   get neverProperty() → Never
     return throw "Should not reach here";
   set neverProperty(Never value) → void {}
-  method nullMethod(core::Null? value) → core::Null?
+  method nullMethod(Null value) → Null
     return value;
-  get nullProperty() → core::Null?
+  get nullProperty() → Null
     return null;
-  set nullProperty(core::Null? value) → void {}
+  set nullProperty(Null value) → void {}
 }
 class BoundedGenericClass<T extends Never = Never> extends core::Object {
   synthetic constructor •() → nev::BoundedGenericClass<nev::BoundedGenericClass::T>
@@ -184,5 +184,5 @@
 
 
 Extra constant evaluation status:
-Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null?)
+Evaluated: TypeLiteral @ org-dartlang-testcase:///never_opt_out.dart:19:20 -> TypeLiteralConstant(Null)
 Extra constant evaluation: evaluated: 136, effectively constant: 1
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
index 06a5216..20bc8a1 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.expect
@@ -247,15 +247,15 @@
   uns::promotionToNever(0);
   uns::promotionToNever(null);
   uns::unnecessaryNullCheck(() → core::int* => 0);
-  uns::unnecessaryNullCheck(() → core::Null? => null);
+  uns::unnecessaryNullCheck(() → Null => null);
   self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
-  self::expect(42, uns::unnecessaryIfNull(() → core::Null? => null, () → core::int* => 42));
+  self::expect(42, uns::unnecessaryIfNull(() → Null => null, () → core::int* => 42));
   uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
   uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
   uns::unnecessaryNullAwareAccess(() → core::int* => 0);
-  uns::unnecessaryNullAwareAccess(() → core::Null? => null);
+  uns::unnecessaryNullAwareAccess(() → Null => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
-  () →* core::Null? f = () → core::Null? => null;
+  () →* Null f = () → Null => null;
   self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
diff --git a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
index 908eb54..272a76b 100644
--- a/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/unsound_checks.dart.weak.transformed.expect
@@ -247,15 +247,15 @@
   uns::promotionToNever(0);
   uns::promotionToNever(null);
   uns::unnecessaryNullCheck(() → core::int* => 0);
-  uns::unnecessaryNullCheck(() → core::Null? => null);
+  uns::unnecessaryNullCheck(() → Null => null);
   self::expect(0, uns::unnecessaryIfNull(() → core::int* => 0, () → core::int* => 42));
-  self::expect(42, uns::unnecessaryIfNull(() → core::Null? => null, () → core::int* => 42));
+  self::expect(42, uns::unnecessaryIfNull(() → Null => null, () → core::int* => 42));
   uns::unnecessaryIfNullAssign(<core::int*>[0], () → core::int* => 42);
   uns::unnecessaryIfNullAssign(<core::int*>[null], () → core::int* => 42);
   uns::unnecessaryNullAwareAccess(() → core::int* => 0);
-  uns::unnecessaryNullAwareAccess(() → core::Null? => null);
+  uns::unnecessaryNullAwareAccess(() → Null => null);
   self::throws(() → dynamic => uns::callReturningNever(() → <BottomType>=> throw "foo"), (core::Object* e) → core::bool* => e.{core::Object::==}("foo"));
-  () →* core::Null? f = () → core::Null? => null;
+  () →* Null f = () → Null => null;
   self::throws(() → dynamic => uns::callReturningNever(f));
   uns::switchOnEnum(#C3);
   uns::switchOnEnum(#C6);
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
index 8a420c1..bc566ba 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.outline.expect
@@ -43,7 +43,7 @@
     ;
   set foo(core::num* value) → void
     ;
-  get bar() → core::Null?
+  get bar() → Null
     ;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -70,8 +70,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
index d9f1769..297ab3b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.expect
@@ -43,7 +43,7 @@
     : super core::Object::•()
     ;
   set foo(core::num* value) → void {}
-  get bar() → core::Null?
+  get bar() → Null
     return null;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,8 +71,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
index d9f1769..297ab3b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/multiple_abstract_setters.dart.strong.transformed.expect
@@ -43,7 +43,7 @@
     : super core::Object::•()
     ;
   set foo(core::num* value) → void {}
-  get bar() → core::Null?
+  get bar() → Null
     return null;
   abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
   abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
@@ -71,8 +71,8 @@
   abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
   abstract member-signature method toString() → core::String*; -> core::Object::toString
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
-  no-such-method-forwarder get bar() → core::Null?
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} core::Null?;
+  no-such-method-forwarder get bar() → Null
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError,ForDynamic} Null;
   no-such-method-forwarder set foo(core::num* value) → void
     return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
index d9547c4..4cacf98 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null as{TypeError,ForNonNullableByDefault} FutureOr<opt::A>;
diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
index d3ace70..704fde7 100644
--- a/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart.weak.transformed.expect
@@ -2,12 +2,12 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAlias> foLegacyNonNullable = null; // error
 //                                          ^
 //
-// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+// pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
 //  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
 //   FutureOr<AAliasNonNullable> foNonNullable = null; // error
 //                                               ^
@@ -21,12 +21,12 @@
 typedef AAliasNonNullable = opt::A;
 typedef AAliasNullable = opt::A?;
 static method test() → dynamic {
-  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+  FutureOr<opt::A>foLegacyNonNullable = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:13:42: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAlias> foLegacyNonNullable = null; // error
                                          ^" in null;
   FutureOr<opt::A?>foLegacyNullable = null;
-  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'A' isn't.
+  FutureOr<opt::A>foNonNullable = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/nonfunction_type_aliases/issue41501.dart:15:47: Error: A value of type 'Null' can't be assigned to a variable of type 'FutureOr<A>' because 'Null' is nullable and 'FutureOr<A>' isn't.
  - 'A' is from 'pkg/front_end/testcases/nonfunction_type_aliases/issue41501_lib.dart'.
   FutureOr<AAliasNonNullable> foNonNullable = null; // error
                                               ^" in null;
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
index 2130845..bfd2076 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null? {
+  function f() → Null {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
index 2130845..bfd2076 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null? {
+  function f() → Null {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 9fbd201..9e77b8e 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -11,7 +11,7 @@
   constructor empty() → self::A<self::A::N*, self::A::S*, self::A::U*>*
     ;
   const constructor c(self::A::U* u, self::A::S* s) → self::A<self::A::N*, self::A::S*, self::A::U*>*
-    : self::A::field = const <core::Null?>[null], super core::Object::•()
+    : self::A::field = const <Null>[null], super core::Object::•()
     ;
   static factory f<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic>(self::A::f::S* s) → self::A<self::A::f::N*, self::A::f::S*, self::A::f::U*>*
     ;
@@ -53,5 +53,5 @@
 
 
 Extra constant evaluation status:
-Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null?>[null])
+Evaluated: ListLiteral @ org-dartlang-testcase:///issue_000070.dart:22:33 -> ListConstant(const <Null>[null])
 Extra constant evaluation: evaluated: 1, effectively constant: 1
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
index 98c4bca..2d43401 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
@@ -66,6 +66,6 @@
 
 constants  {
   #C1 = null
-  #C2 = <core::Null?>[#C1]
+  #C2 = <Null>[#C1]
   #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
index e4737bd..b0d7301 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
@@ -66,6 +66,6 @@
 
 constants  {
   #C1 = null
-  #C2 = <core::Null?>[#C1]
+  #C2 = <Null>[#C1]
   #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
index bf1076a..a132ec8 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
@@ -30,6 +30,6 @@
 }
 static method main() → dynamic {
   core::print(new self::Sub::•().{self::Sub::hashCode});
-  core::List<core::Null?>* l = <core::Null?>[null];
-  let final core::List<core::Null?>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} core::Null?) : null;
+  core::List<Null>* l = <Null>[null];
+  let final core::List<Null>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} Null) : null;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
index 8b6d4d8..501253f 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -30,8 +30,8 @@
 }
 static method main() → dynamic {
   core::print(new self::Sub::•().{self::Sub::hashCode});
-  core::List<core::Null?>* l = <core::Null?>[null];
-  let final core::List<core::Null?>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} core::Null?) : null;
+  core::List<Null>* l = <Null>[null];
+  let final core::List<Null>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} #t2.{core::List::[]=}(#t3, "fisk" as{TypeError} Null) : null;
 }
 
 
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
index c6c6d4d..07a6b9a7 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  <() →* core::Null?>[let final () →* core::Null? f = () → core::Null? {} in f];
+  <() →* Null>[let final () →* Null f = () → Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
index c6c6d4d..07a6b9a7 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  <() →* core::Null?>[let final () →* core::Null? f = () → core::Null? {} in f];
+  <() →* Null>[let final () →* Null f = () → Null {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
index a052ac0..f545925 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
@@ -12,8 +12,7 @@
 // ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () →* core::Null? h = () → core::Null? => null in h;
+  return let final () →* Null h = () → Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
index a052ac0..f545925 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
@@ -12,8 +12,7 @@
 // ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () →* core::Null? h = () → core::Null? => null in h;
+  return let final () →* Null h = () → Null => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
index 86dc966..a166dcf 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
@@ -7,10 +7,9 @@
 //             ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () →* core::Null? f = () → core::Null? {} in f);
+  self::foo(null, let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
index 86dc966..a166dcf 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
@@ -7,10 +7,9 @@
 //             ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () →* core::Null? f = () → core::Null? {} in f);
+  self::foo(null, let final () →* Null f = () → Null {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
index df04eff..aee80bb 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () →* core::Null? f = () → core::Null? {} in f).call();
+  (let final () →* Null f = () → Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
index df04eff..aee80bb 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
@@ -7,8 +7,7 @@
 //    ^
 //
 import self as self;
-import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () →* core::Null? f = () → core::Null? {} in f).call();
+  (let final () →* Null f = () → Null {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
index 00428db..84f19bf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -24,7 +24,7 @@
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → core::Null? {
+  (<S extends self::A* = self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
index 00428db..84f19bf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
   bar.call<self::A*>(new self::A::•());
-  (<S extends self::A* = self::A*>(S* s) → core::Null? {
+  (<S extends self::A* = self::A*>(S* s) → Null {
     core::print("s.foo()=${s.{self::A::foo}()}");
   }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
index a9152eb..46e374c 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
@@ -8,7 +8,7 @@
   core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends (T*) →* dynamic = (core::Null?) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::List<core::List<T*>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
 }
 
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index 14ec668..27bf019 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -8,7 +8,7 @@
   core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<T*>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::Comparable<S*>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
-  core::print((<T extends (T*) →* dynamic = (core::Null?) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T*) →* dynamic = (Null) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
   core::print((<T extends core::List<core::List<T*>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
 }
 
diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
index 828cbd5..ccb6dec 100644
--- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.expect
@@ -17,7 +17,7 @@
     #L3:
     case #C2:
       {
-        (() → core::Null? {
+        (() → Null {
           switch(inner) {
             #L4:
             case #C1:
diff --git a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
index 828cbd5..ccb6dec 100644
--- a/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_39040.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
     #L3:
     case #C2:
       {
-        (() → core::Null? {
+        (() → Null {
           switch(inner) {
             #L4:
             case #C1:
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect b/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
index d0a3c7c..4f27b66 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.strong.expect
@@ -42,14 +42,14 @@
 }
 static method main() → dynamic {
   dynamic stringList = <core::String*>["string"];
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test1(stringList);
   });
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test2(stringList);
   });
   dynamic stringMap = <core::String*, core::String*>{"a": "b"};
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test3(stringMap);
   });
 }
diff --git a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
index 68f6106..c5501c9 100644
--- a/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_42423.dart.strong.transformed.expect
@@ -57,14 +57,14 @@
 }
 static method main() → dynamic {
   dynamic stringList = <core::String*>["string"];
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test1(stringList);
   });
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test2(stringList);
   });
   dynamic stringMap = <core::String*, core::String*>{"a": "b"};
-  exp::Expect::throwsTypeError(() → core::Null? {
+  exp::Expect::throwsTypeError(() → Null {
     self::test3(stringMap);
   });
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
index 051b376..86eda63 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
@@ -20,7 +20,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method g(self::C<core::num*>* c) → void {
-  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null? {});
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → Null {});
 }
 static method test() → void {
   self::g(new self::C::•<core::int*>());
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
index 051b376..86eda63 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
   abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
 }
 static method g(self::C<core::num*>* c) → void {
-  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null? {});
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → Null {});
 }
 static method test() → void {
   self::g(new self::C::•<core::int*>());
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
index bec3c2e..fcd72a0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     ;
   operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
index 9b11bf0c..3bb4b53 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 4656a41..f94a84b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 typedef F<contravariant T extends core::Object* = dynamic> = (T*) →* void;
-class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (core::Null?) →* void> extends core::Object {
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (Null) →* void> extends core::Object {
   synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 408ea27..e5ff096 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -85,7 +85,7 @@
                                              ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(let final self::D* #t3 = d in let final core::int* #t4 = 0 in #t3.{self::D::setValue}.call(#t4), 1);
   d = new self::D::•(new self::C::•<core::num*>(#C2));
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     let final self::D* #t5 = d in #t5.{self::D::value} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
     d.value /*@ checkReturn=(num*) ->* num* */ += 1;
                                                ^" in (#t5.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 7907879..909cbfa 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
                                              ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(let final self::D* #t3 = d in let final core::int* #t4 = 0 in #t3.{self::D::setValue}.call(#t4), 1);
   d = new self::D::•(new self::C::•<core::num*>(#C2));
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     let final self::D* #t5 = d in #t5.{self::D::value} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:48: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
     d.value /*@ checkReturn=(num*) ->* num* */ += 1;
                                                ^" in (#t5.{self::D::value}.{self::C::+}(1) as{TypeError,CovarianceCheck} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index 4f7989a..6b59110 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -102,12 +102,12 @@
   }
 }
 static method test(self::I<core::Object*>* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 1;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 2;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index b8a30d8..48bd4ce 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -111,12 +111,12 @@
   }
 }
 static method test(self::I<core::Object*>* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 2;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 4;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
index e26385d..ac79e6e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
@@ -61,11 +61,11 @@
   c.{self::C::f}("hello");
 }
 static method test(self::C* c, self::I* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
index e26385d..ac79e6e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
@@ -61,11 +61,11 @@
   c.{self::C::f}("hello");
 }
 static method test(self::C* c, self::I* i) → void {
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null? {
+  self::expectTypeError(() → Null {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
index 3d8af13..a46c9ef 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.outline.expect
@@ -36,12 +36,12 @@
 static field core::Map<dynamic, core::int*>* map10;
 static field core::Map<dynamic, core::int*>* map11;
 static field core::Map<core::int*, core::int*>* map12;
-static field core::Map<dynamic, core::Null?>* error4;
-static field core::Map<dynamic, core::Null?>* error5;
+static field core::Map<dynamic, Null>* error4;
+static field core::Map<dynamic, Null>* error5;
 static field dynamic error6;
 static field dynamic error7;
-static field core::Map<dynamic, core::Null?>* error8;
-static field core::Map<dynamic, core::Null?>* error9;
+static field core::Map<dynamic, Null>* error8;
+static field core::Map<dynamic, Null>* error9;
 static field dynamic error10;
 static field dynamic error11;
 static field dynamic error12;
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
index 6852242..9a51fe1 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.expect
@@ -146,10 +146,10 @@
       for (final core::MapEntry<core::int*, core::int*>* #t21 in <core::int*, core::int*>{0: 1}.{core::Map::entries})
         #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
 } =>#t20;
-static field core::Map<dynamic, core::Null?>* error4 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error5 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error5 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error5 = {if (b) for (var a in list) a else 0: 1};
                      ^": null};
 static field dynamic error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
@@ -158,10 +158,10 @@
 static field dynamic error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:38:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error7 = {
              ^";
-static field core::Map<dynamic, core::Null?>* error8 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error8 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error9 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error9 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
                      ^": null};
 static field dynamic error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
diff --git a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
index 819c6c1..dd3b4fe 100644
--- a/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/unified_collections/mixed_entries.dart.strong.transformed.expect
@@ -200,10 +200,10 @@
       }
     }
 } =>#t20;
-static field core::Map<dynamic, core::Null?>* error4 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error4 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:33:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error4 = {if (b) 0: 1 else for (var a in list) a};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error5 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error5 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:34:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error5 = {if (b) for (var a in list) a else 0: 1};
                      ^": null};
 static field dynamic error6 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:35:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
@@ -212,10 +212,10 @@
 static field dynamic error7 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:38:14: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error7 = {
              ^";
-static field core::Map<dynamic, core::Null?>* error8 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error8 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:41:32: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error8 = {if (b) 0: 1 else for (var i = 0; i < list.length; i++) list[i]};
                                ^": null};
-static field core::Map<dynamic, core::Null?>* error9 = <dynamic, core::Null?>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
+static field core::Map<dynamic, Null>* error9 = <dynamic, Null>{invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:42:22: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
 var error9 = {if (b) for (var i = 0; i < list.length; i++) list[i] else 0: 1};
                      ^": null};
 static field dynamic error10 = invalid-expression "pkg/front_end/testcases/unified_collections/mixed_entries.dart:43:15: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
index 183b9bb..4b64468 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.expect
@@ -167,7 +167,7 @@
 static method main() → dynamic {
   self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
   self::expect(null, a.{self::A::field});
-  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method}(3, (core::num* num) → Null {}, "test");
   a.{self::A::method2}(3);
   a.{self::A::x} = 3;
   core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError,CovarianceCheck} core::Map<core::num*, self::Contravariant<core::String*>*>*;
@@ -183,7 +183,7 @@
   self::expect(null, c.{self::C::field});
   c.{self::C::method}(3, 2);
   c.{self::C::x} = 3;
-  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → Null {});
   d.{self::D::method}("test");
   self::NoSuchMethod<core::num*>* nsm = new self::NoSuchMethod::•<core::num*>();
   self::expect(3, nsm.{self::B::method}(3));
diff --git a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
index 183b9bb..4b64468 100644
--- a/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/variance/generic_covariance_sound_variance.dart.strong.transformed.expect
@@ -167,7 +167,7 @@
 static method main() → dynamic {
   self::A<core::int*, core::num*, core::String*>* a = new self::A::•<core::int*, core::num*, core::String*>();
   self::expect(null, a.{self::A::field});
-  a.{self::A::method}(3, (core::num* num) → core::Null? {}, "test");
+  a.{self::A::method}(3, (core::num* num) → Null {}, "test");
   a.{self::A::method2}(3);
   a.{self::A::x} = 3;
   core::Map<core::num*, self::Contravariant<core::String*>*>* mapContra = a.{self::A::mapContra} as{TypeError,CovarianceCheck} core::Map<core::num*, self::Contravariant<core::String*>*>*;
@@ -183,7 +183,7 @@
   self::expect(null, c.{self::C::field});
   c.{self::C::method}(3, 2);
   c.{self::C::x} = 3;
-  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → core::Null? {});
+  self::D<core::Object*>* d = new self::F::•<core::String*>((core::String* s) → Null {});
   d.{self::D::method}("test");
   self::NoSuchMethod<core::num*>* nsm = new self::NoSuchMethod::•<core::num*>();
   self::expect(3, nsm.{self::B::method}(3));
diff --git a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
index fcc030b..d9a2571 100644
--- a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.expect
@@ -53,8 +53,8 @@
 static method main() → dynamic {
   self::Covariant<dynamic>* cov = new self::Covariant::•<dynamic>();
   self::covariantListInfer<dynamic>(new self::Covariant::•<core::List<dynamic>*>());
-  self::Contravariant<core::Null?>* contra = new self::Contravariant::•<core::Null?>();
-  self::contravariantListInfer<core::Null?>(new self::Contravariant::•<core::List<core::Null?>*>());
+  self::Contravariant<Null>* contra = new self::Contravariant::•<Null>();
+  self::contravariantListInfer<Null>(new self::Contravariant::•<core::List<Null>*>());
   self::Invariant<dynamic>* inv = new self::Invariant::•<dynamic>();
-  self::invariantListInfer<core::Null?>(new self::Invariant::•<core::List<core::Null?>*>());
+  self::invariantListInfer<Null>(new self::Invariant::•<core::List<Null>*>());
 }
diff --git a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
index fcc030b..d9a2571 100644
--- a/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/variance/unconstrained_inference.dart.strong.transformed.expect
@@ -53,8 +53,8 @@
 static method main() → dynamic {
   self::Covariant<dynamic>* cov = new self::Covariant::•<dynamic>();
   self::covariantListInfer<dynamic>(new self::Covariant::•<core::List<dynamic>*>());
-  self::Contravariant<core::Null?>* contra = new self::Contravariant::•<core::Null?>();
-  self::contravariantListInfer<core::Null?>(new self::Contravariant::•<core::List<core::Null?>*>());
+  self::Contravariant<Null>* contra = new self::Contravariant::•<Null>();
+  self::contravariantListInfer<Null>(new self::Contravariant::•<core::List<Null>*>());
   self::Invariant<dynamic>* inv = new self::Invariant::•<dynamic>();
-  self::invariantListInfer<core::Null?>(new self::Invariant::•<core::List<core::Null?>*>());
+  self::invariantListInfer<Null>(new self::Invariant::•<core::List<Null>*>());
 }
diff --git a/pkg/front_end/tool/_fasta/bench_maker.dart b/pkg/front_end/tool/_fasta/bench_maker.dart
index 581b5a9..6623d7a 100644
--- a/pkg/front_end/tool/_fasta/bench_maker.dart
+++ b/pkg/front_end/tool/_fasta/bench_maker.dart
@@ -253,6 +253,11 @@
   }
 
   @override
+  void visitNullType(NullType node, StringBuffer sb) {
+    sb.write("Null");
+  }
+
+  @override
   void visitInterfaceType(InterfaceType node, StringBuffer sb) {
     Class cls = node.classNode;
     sb.write(computeName(cls));
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 7ce8cba..7df2713 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -3068,7 +3068,7 @@
       type =
           typeParameterType.promotedBound ?? typeParameterType.parameter.bound;
     }
-    if (type == context.typeEnvironment.nullType) {
+    if (type is NullType) {
       return context.typeEnvironment.coreTypes
           .bottomInterfaceType(superclass, context.nullable);
     } else if (type is NeverType) {
@@ -4970,7 +4970,7 @@
 
   DartType getStaticTypeInternal(StaticTypeContext context) {
     DartType operandType = operand.getStaticType(context);
-    return operandType == context.typeEnvironment.nullType
+    return operandType is NullType
         ? const NeverType(Nullability.nonNullable)
         : operandType.withDeclaredNullability(Nullability.nonNullable);
   }
@@ -5132,8 +5132,7 @@
       getStaticTypeInternal(context);
 
   @override
-  DartType getStaticTypeInternal(StaticTypeContext context) =>
-      context.typeEnvironment.nullType;
+  DartType getStaticTypeInternal(StaticTypeContext context) => const NullType();
 
   R accept<R>(ExpressionVisitor<R> v) => v.visitNullLiteral(this);
   R accept1<R, A>(ExpressionVisitor1<R, A> v, A arg) =>
@@ -7609,6 +7608,49 @@
   }
 }
 
+class NullType extends DartType {
+  @override
+  final int hashCode = 415324;
+
+  const NullType();
+
+  @override
+  R accept<R>(DartTypeVisitor<R> v) => v.visitNullType(this);
+
+  @override
+  R accept1<R, A>(DartTypeVisitor1<R, A> v, A arg) {
+    return v.visitNullType(this, arg);
+  }
+
+  @override
+  void visitChildren(Visitor v) {}
+
+  @override
+  bool operator ==(Object other) => equals(other, null);
+
+  @override
+  bool equals(Object other, Assumptions assumptions) => other is NullType;
+
+  @override
+  Nullability get declaredNullability => Nullability.nullable;
+
+  @override
+  Nullability get nullability => Nullability.nullable;
+
+  @override
+  DartType withDeclaredNullability(Nullability nullability) => this;
+
+  @override
+  String toString() {
+    return "NullType(${toStringInternal()})";
+  }
+
+  @override
+  void toTextInternal(AstPrinter printer) {
+    printer.write("Null");
+  }
+}
+
 class InterfaceType extends DartType {
   Reference className;
 
@@ -8964,8 +9006,7 @@
   R accept<R>(ConstantVisitor<R> v) => v.visitNullConstant(this);
   R acceptReference<R>(Visitor<R> v) => v.visitNullConstantReference(this);
 
-  DartType getType(StaticTypeContext context) =>
-      context.typeEnvironment.nullType;
+  DartType getType(StaticTypeContext context) => const NullType();
 
   @override
   String toString() => 'NullConstant(${toStringInternal()})';
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index 2c79146..97bda78 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -2119,7 +2119,7 @@
   }
 
   Supertype readSupertype() {
-    InterfaceType type = readDartType();
+    InterfaceType type = readDartType(forSupertype: true);
     assert(
         type.nullability == _currentLibrary.nonNullable,
         "In serialized form supertypes should have Nullability.legacy if they "
@@ -2174,7 +2174,7 @@
     return readAndCheckOptionTag() ? readDartType() : null;
   }
 
-  DartType readDartType() {
+  DartType readDartType({bool forSupertype: false}) {
     int tag = readByte();
     switch (tag) {
       case Tag.TypedefType:
@@ -2211,7 +2211,18 @@
             reference, Nullability.values[nullabilityIndex], typeArguments);
       case Tag.SimpleInterfaceType:
         int nullabilityIndex = readByte();
-        return new InterfaceType.byReference(readClassReference(),
+        Reference classReference = readClassReference();
+        {
+          CanonicalName canonicalName = classReference.canonicalName;
+          if (canonicalName != null &&
+              !forSupertype &&
+              canonicalName.name == "Null" &&
+              canonicalName.parent?.name == "dart:core" &&
+              (canonicalName.parent?.parent?.isRoot ?? false)) {
+            return const NullType();
+          }
+        }
+        return new InterfaceType.byReference(classReference,
             Nullability.values[nullabilityIndex], const <DartType>[]);
       case Tag.FunctionType:
         int typeParameterStackHeight = typeParameterStack.length;
@@ -2455,9 +2466,9 @@
   }
 
   @override
-  DartType readDartType() {
+  DartType readDartType({bool forSupertype = false}) {
     final nodeOffset = _byteOffset;
-    final result = super.readDartType();
+    final result = super.readDartType(forSupertype: forSupertype);
     return _associateMetadata(result, nodeOffset);
   }
 
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 3ac762a..a0940ff 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -2103,6 +2103,24 @@
   }
 
   @override
+  void visitNullType(NullType node) {
+    // TODO(dmitryas): Remove special treatment of Null when the VM supports the
+    // new encoding: just write the tag.
+    assert(_knownCanonicalNameNonRootTops != null &&
+        _knownCanonicalNameNonRootTops.isNotEmpty);
+    CanonicalName root = _knownCanonicalNameNonRootTops.first;
+    while (!root.isRoot) {
+      root = root.parent;
+    }
+    CanonicalName canonicalNameOfNull =
+        root.getChild("dart:core").getChild("Null");
+    writeByte(Tag.SimpleInterfaceType);
+    writeByte(node.declaredNullability.index);
+    checkCanonicalName(canonicalNameOfNull);
+    writeUInt30(canonicalNameOfNull.index + 1);
+  }
+
+  @override
   void visitSupertype(Supertype node) {
     // Writing nullability below is only necessary because
     // BinaryBuilder.readSupertype reads the supertype as an InterfaceType and
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index 710baf7..cb03a01 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -29,8 +29,8 @@
 
   /// Returns the instantiation of [superclass] that is implemented by [type],
   /// or `null` if [type] does not implement [superclass] at all.
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes);
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary);
 
   /// Returns the type arguments of the instantiation of [superclass] that is
   /// implemented by [type], or `null` if [type] does not implement [superclass]
@@ -613,8 +613,8 @@
     // LLUB(Null, List<dynamic>*) = List<dynamic>*.  In opt-in libraries the
     // rules imply that LLUB(Null, List<dynamic>*) = List<dynamic>?.
     if (!clientLibrary.isNonNullableByDefault) {
-      if (type1 == coreTypes.nullType) return type2;
-      if (type2 == coreTypes.nullType) return type1;
+      if (type1 is NullType) return type2;
+      if (type2 is NullType) return type1;
     }
 
     _ClassInfo info1 = infoFor(type1.classNode);
@@ -722,16 +722,15 @@
   }
 
   @override
-  InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
-      Library clientLibrary, CoreTypes coreTypes) {
+  InterfaceType getTypeAsInstanceOf(
+      InterfaceType type, Class superclass, Library clientLibrary) {
     List<DartType> typeArguments =
         getTypeArgumentsAsInstanceOf(type, superclass);
     if (typeArguments == null) return null;
     // The return value should be a legacy type if it's computed for an
     // opted-out library, unless the return value is Null? which is always
     // nullable.
-    Nullability nullability = superclass == coreTypes.nullClass ||
-            clientLibrary.isNonNullableByDefault
+    Nullability nullability = clientLibrary.isNonNullableByDefault
         ? type.nullability
         : Nullability.legacy;
     return new InterfaceType(superclass, nullability, typeArguments);
diff --git a/pkg/kernel/lib/core_types.dart b/pkg/kernel/lib/core_types.dart
index 2b9c480..24f0250 100644
--- a/pkg/kernel/lib/core_types.dart
+++ b/pkg/kernel/lib/core_types.dart
@@ -44,7 +44,7 @@
 
   Library _coreLibrary;
   Class _objectClass;
-  Class _nullClass;
+  Class _deprecatedNullClass;
   Class _boolClass;
   Class _intClass;
   Class _numClass;
@@ -113,7 +113,7 @@
   InterfaceType _objectLegacyRawType;
   InterfaceType _objectNullableRawType;
   InterfaceType _objectNonNullableRawType;
-  InterfaceType _nullType;
+  InterfaceType _deprecatedNullType;
   InterfaceType _boolLegacyRawType;
   InterfaceType _boolNullableRawType;
   InterfaceType _boolNonNullableRawType;
@@ -384,8 +384,8 @@
         index.getMember('dart:core', 'NoSuchMethodError', 'withInvocation');
   }
 
-  Class get nullClass {
-    return _nullClass ??= index.getClass('dart:core', 'Null');
+  Class get deprecatedNullClass {
+    return _deprecatedNullClass ??= index.getClass('dart:core', 'Null');
   }
 
   Class get numClass {
@@ -531,9 +531,10 @@
   }
 
   /// Null is always nullable, so there's only one raw type for that class.
-  InterfaceType get nullType {
-    return _nullType ??= _nullableRawTypes[nullClass] ??=
-        new InterfaceType(nullClass, Nullability.nullable, const <DartType>[]);
+  InterfaceType get deprecatedNullType {
+    return _deprecatedNullType ??= _nullableRawTypes[deprecatedNullClass] ??=
+        new InterfaceType(
+            deprecatedNullClass, Nullability.nullable, const <DartType>[]);
   }
 
   InterfaceType get boolLegacyRawType {
@@ -1357,7 +1358,7 @@
     if (type is InvalidType) return false;
 
     // NULL(Null) is true.
-    if (type == nullType) return true;
+    if (type is NullType) return true;
 
     // NULL(T?) is true iff NULL(T) or BOTTOM(T).
     // NULL(T*) is true iff NULL(T) or BOTTOM(T).
diff --git a/pkg/kernel/lib/src/bounds_checks.dart b/pkg/kernel/lib/src/bounds_checks.dart
index 3bbef8a..7c5ee41 100644
--- a/pkg/kernel/lib/src/bounds_checks.dart
+++ b/pkg/kernel/lib/src/bounds_checks.dart
@@ -15,6 +15,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -267,7 +268,7 @@
     DartType bottomType,
     {bool allowSuperBounded = false}) {
   assert(bottomType == const NeverType(Nullability.nonNullable) ||
-      bottomType == typeEnvironment.nullType);
+      bottomType is NullType);
   List<TypeParameter> variables;
   List<DartType> arguments;
   List<TypeArgumentIssue> typedefRhsResult;
@@ -435,7 +436,7 @@
     {Map<FunctionType, List<DartType>> typedefInstantiations}) {
   assert(arguments.length == parameters.length);
   assert(bottomType == const NeverType(Nullability.nonNullable) ||
-      bottomType == typeEnvironment.nullType);
+      bottomType is NullType);
   List<TypeArgumentIssue> result;
   var substitutionMap = <TypeParameter, DartType>{};
   for (int i = 0; i < arguments.length; ++i) {
@@ -688,6 +689,12 @@
   }
 
   @override
+  int visitNullType(
+      NullType node, Map<TypeParameter, Map<DartType, int>> computedVariances) {
+    return Variance.unrelated;
+  }
+
+  @override
   int visitVoidType(
       VoidType node, Map<TypeParameter, Map<DartType, int>> computedVariances) {
     return Variance.unrelated;
diff --git a/pkg/kernel/lib/src/dart_type_equivalence.dart b/pkg/kernel/lib/src/dart_type_equivalence.dart
index 35def49..35eeff4 100644
--- a/pkg/kernel/lib/src/dart_type_equivalence.dart
+++ b/pkg/kernel/lib/src/dart_type_equivalence.dart
@@ -8,6 +8,7 @@
 
 class DartTypeEquivalence implements DartTypeVisitor1<bool, DartType> {
   final CoreTypes coreTypes;
+  // TODO(dmitryas): Implement also equateBottomTypes.
   final bool equateTopTypes;
   final bool ignoreAllNullabilities;
   final bool ignoreTopLevelNullability;
@@ -198,6 +199,11 @@
   }
 
   @override
+  bool visitNullType(NullType node, DartType other) {
+    return other is NullType;
+  }
+
+  @override
   bool visitNeverType(NeverType node, DartType other) {
     if (other is NeverType) {
       return _checkAndRegisterNullabilities(
diff --git a/pkg/kernel/lib/src/future_value_type.dart b/pkg/kernel/lib/src/future_value_type.dart
index 939bb69..e3fd270 100644
--- a/pkg/kernel/lib/src/future_value_type.dart
+++ b/pkg/kernel/lib/src/future_value_type.dart
@@ -82,6 +82,12 @@
   }
 
   @override
+  DartType visitNullType(DartType node, CoreTypes coreTypes) {
+    // Otherwise, for all S, futureValueType(S) = Object?.
+    return coreTypes.objectNullableRawType;
+  }
+
+  @override
   DartType visitTypeParameterType(DartType node, CoreTypes coreTypes) {
     // Otherwise, for all S, futureValueType(S) = Object?.
     return coreTypes.objectNullableRawType;
diff --git a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
index eadc8fa..9474496 100644
--- a/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
+++ b/pkg/kernel/lib/src/hierarchy_based_type_environment.dart
@@ -21,20 +21,13 @@
   @override
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   @override
   List<DartType> getTypeArgumentsAsInstanceOf(
       InterfaceType type, Class superclass) {
-    Class typeClass = type.classNode;
-    if (typeClass == superclass) return type.typeArguments;
-    if (typeClass == coreTypes.nullClass) {
-      if (superclass.typeParameters.isEmpty) return const <DartType>[];
-      return new List<DartType>.filled(
-          superclass.typeParameters.length, coreTypes.nullType);
-    }
+    if (type.classNode == superclass) return type.typeArguments;
     return hierarchy.getTypeArgumentsAsInstanceOf(type, superclass);
   }
 
diff --git a/pkg/kernel/lib/src/legacy_erasure.dart b/pkg/kernel/lib/src/legacy_erasure.dart
index 44a5d3a..83c32ce 100644
--- a/pkg/kernel/lib/src/legacy_erasure.dart
+++ b/pkg/kernel/lib/src/legacy_erasure.dart
@@ -71,11 +71,5 @@
   }
 
   @override
-  DartType visitInterfaceType(InterfaceType node) {
-    if (node.classNode == coreTypes.nullClass) return null;
-    return super.visitInterfaceType(node);
-  }
-
-  @override
-  DartType visitNeverType(NeverType node) => coreTypes.nullType;
+  DartType visitNeverType(NeverType node) => const NullType();
 }
diff --git a/pkg/kernel/lib/src/merge_visitor.dart b/pkg/kernel/lib/src/merge_visitor.dart
index 275b7d88..4b1e68b 100644
--- a/pkg/kernel/lib/src/merge_visitor.dart
+++ b/pkg/kernel/lib/src/merge_visitor.dart
@@ -208,6 +208,14 @@
   }
 
   @override
+  DartType visitNullType(NullType a, DartType b) {
+    if (b is NullType) {
+      return a;
+    }
+    return null;
+  }
+
+  @override
   DartType visitInvalidType(InvalidType a, DartType b) => null;
 
   @override
diff --git a/pkg/kernel/lib/src/nnbd_top_merge.dart b/pkg/kernel/lib/src/nnbd_top_merge.dart
index f0c5b4e..5b3634a 100644
--- a/pkg/kernel/lib/src/nnbd_top_merge.dart
+++ b/pkg/kernel/lib/src/nnbd_top_merge.dart
@@ -69,11 +69,6 @@
         // NNBD_TOP_MERGE(Object*, void) = Object?
         return coreTypes.objectNullableRawType;
       }
-    } else if (a == coreTypes.nullType &&
-        b is NeverType &&
-        b.nullability == Nullability.legacy) {
-      // NNBD_TOP_MERGE(Null, Never*) = Null
-      return coreTypes.nullType;
     }
     return super.visitInterfaceType(a, b);
   }
@@ -116,10 +111,19 @@
 
   @override
   DartType visitNeverType(NeverType a, DartType b) {
-    if (a.nullability == Nullability.legacy && b == coreTypes.nullType) {
+    if (a.nullability == Nullability.legacy && b is NullType) {
       // NNBD_TOP_MERGE(Never*, Null) = Null
-      return coreTypes.nullType;
+      return const NullType();
     }
     return super.visitNeverType(a, b);
   }
+
+  @override
+  DartType visitNullType(NullType a, DartType b) {
+    if (b is NeverType && b.nullability == Nullability.legacy) {
+      // NNBD_TOP_MERGE(Null, Never*) = Null
+      return const NullType();
+    }
+    return super.visitNullType(a, b);
+  }
 }
diff --git a/pkg/kernel/lib/src/non_null.dart b/pkg/kernel/lib/src/non_null.dart
index 2e28022..14e0c01 100644
--- a/pkg/kernel/lib/src/non_null.dart
+++ b/pkg/kernel/lib/src/non_null.dart
@@ -3,34 +3,33 @@
 // BSD-style license that can be found in the LICENSE.md file.
 
 import '../ast.dart';
-import '../core_types.dart';
 
 /// Returns the type defines as `NonNull(type)` in the nnbd specification.
-DartType computeNonNull(CoreTypes coreTypes, DartType type) {
-  return type.accept1(const _NonNullVisitor(), coreTypes) ?? type;
+DartType computeNonNull(DartType type) {
+  return type.accept(const _NonNullVisitor()) ?? type;
 }
 
 /// Visitor that computes the `NonNull` function defined in the nnbd
 /// specification.
 ///
 /// The visitor returns `null` if `NonNull(T) = T`.
-class _NonNullVisitor implements DartTypeVisitor1<DartType, CoreTypes> {
+class _NonNullVisitor implements DartTypeVisitor<DartType> {
   const _NonNullVisitor();
 
   @override
-  DartType defaultDartType(DartType node, CoreTypes coreTypes) {
+  DartType defaultDartType(DartType node) {
     throw new UnsupportedError(
         "Unexpected DartType ${node} (${node.runtimeType})");
   }
 
   @override
-  DartType visitBottomType(BottomType node, CoreTypes coreTypes) => null;
+  DartType visitBottomType(BottomType node) => null;
 
   @override
-  DartType visitDynamicType(DynamicType node, CoreTypes coreTypes) => null;
+  DartType visitDynamicType(DynamicType node) => null;
 
   @override
-  DartType visitFunctionType(FunctionType node, CoreTypes coreTypes) {
+  DartType visitFunctionType(FunctionType node) {
     if (node.declaredNullability == Nullability.nonNullable) {
       return null;
     }
@@ -38,8 +37,8 @@
   }
 
   @override
-  DartType visitFutureOrType(FutureOrType node, CoreTypes coreTypes) {
-    DartType typeArgument = node.typeArgument.accept1(this, coreTypes);
+  DartType visitFutureOrType(FutureOrType node) {
+    DartType typeArgument = node.typeArgument.accept(this);
     if (node.declaredNullability == Nullability.nonNullable &&
         typeArgument == null) {
       return null;
@@ -49,10 +48,7 @@
   }
 
   @override
-  DartType visitInterfaceType(InterfaceType node, CoreTypes coreTypes) {
-    if (node == coreTypes.nullType) {
-      return const NeverType(Nullability.nonNullable);
-    }
+  DartType visitInterfaceType(InterfaceType node) {
     if (node.declaredNullability == Nullability.nonNullable) {
       return null;
     }
@@ -60,10 +56,10 @@
   }
 
   @override
-  DartType visitInvalidType(InvalidType node, CoreTypes coreTypes) => null;
+  DartType visitInvalidType(InvalidType node) => null;
 
   @override
-  DartType visitNeverType(NeverType node, CoreTypes coreTypes) {
+  DartType visitNeverType(NeverType node) {
     if (node.declaredNullability == Nullability.nonNullable) {
       return null;
     }
@@ -71,7 +67,12 @@
   }
 
   @override
-  DartType visitTypeParameterType(TypeParameterType node, CoreTypes coreTypes) {
+  DartType visitNullType(NullType node) {
+    return const NeverType(Nullability.nonNullable);
+  }
+
+  @override
+  DartType visitTypeParameterType(TypeParameterType node) {
     if (node.nullability == Nullability.nonNullable) {
       return null;
     }
@@ -81,7 +82,7 @@
         // nullability to non-nullable.
         return node.withDeclaredNullability(Nullability.nonNullable);
       }
-      DartType promotedBound = node.promotedBound.accept1(this, coreTypes);
+      DartType promotedBound = node.promotedBound.accept(this);
       if (promotedBound == null) {
         // The promoted bound could not be made non-nullable so we set the
         // declared nullability to undetermined.
@@ -107,7 +108,7 @@
         // to non-nullable.
         return node.withDeclaredNullability(Nullability.nonNullable);
       }
-      DartType bound = node.bound.accept1(this, coreTypes);
+      DartType bound = node.bound.accept(this);
       if (bound == null) {
         // The bound could not be made non-nullable so we set the declared
         // nullability to undetermined.
@@ -127,7 +128,7 @@
   }
 
   @override
-  DartType visitTypedefType(TypedefType node, CoreTypes coreTypes) {
+  DartType visitTypedefType(TypedefType node) {
     if (node.declaredNullability == Nullability.nonNullable) {
       return null;
     }
@@ -135,5 +136,5 @@
   }
 
   @override
-  DartType visitVoidType(VoidType node, CoreTypes coreTypes) => null;
+  DartType visitVoidType(VoidType node) => null;
 }
diff --git a/pkg/kernel/lib/src/norm.dart b/pkg/kernel/lib/src/norm.dart
index ac209fb..c8d0f71 100644
--- a/pkg/kernel/lib/src/norm.dart
+++ b/pkg/kernel/lib/src/norm.dart
@@ -132,7 +132,7 @@
 
   @override
   DartType visitNeverType(NeverType node) {
-    if (node.nullability == Nullability.nullable) return coreTypes.nullType;
+    if (node.nullability == Nullability.nullable) return const NullType();
     return null;
   }
 
diff --git a/pkg/kernel/lib/src/replacement_visitor.dart b/pkg/kernel/lib/src/replacement_visitor.dart
index 72ddff6..5aea426 100644
--- a/pkg/kernel/lib/src/replacement_visitor.dart
+++ b/pkg/kernel/lib/src/replacement_visitor.dart
@@ -146,11 +146,6 @@
       // No nullability or type arguments needed to be substituted.
       return null;
     } else {
-      if (node.classNode.name == 'Null' &&
-          node.classNode.enclosingLibrary.importUri.scheme == 'dart' &&
-          node.classNode.enclosingLibrary.importUri.path == 'core') {
-        return null;
-      }
       return new InterfaceType(
           node.classNode,
           newNullability ?? node.nullability,
@@ -195,6 +190,9 @@
   }
 
   @override
+  DartType visitNullType(NullType node) => null;
+
+  @override
   DartType visitInvalidType(InvalidType node) => null;
 
   @override
diff --git a/pkg/kernel/lib/src/standard_bounds.dart b/pkg/kernel/lib/src/standard_bounds.dart
index f94edc0..64a1755 100644
--- a/pkg/kernel/lib/src/standard_bounds.dart
+++ b/pkg/kernel/lib/src/standard_bounds.dart
@@ -17,6 +17,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -160,12 +161,12 @@
     }
 
     // MOREBOTTOM(Null, T) = true.
-    if (s == coreTypes.nullType) {
+    if (s is NullType) {
       return true;
     }
 
     // MOREBOTTOM(S, Null) = false.
-    if (t == coreTypes.nullType) {
+    if (t is NullType) {
       return false;
     }
 
@@ -358,7 +359,7 @@
       if (type2.nullability == Nullability.nonNullable) {
         return type2;
       }
-      type2 = computeNonNull(coreTypes, type2);
+      type2 = computeNonNull(type2);
       if (type2.nullability == Nullability.nonNullable) {
         return type2;
       }
@@ -367,7 +368,7 @@
       if (type1.nullability == Nullability.nonNullable) {
         return type1;
       }
-      type1 = computeNonNull(coreTypes, type1);
+      type1 = computeNonNull(type1);
       if (type1.nullability == Nullability.nonNullable) {
         return type1;
       }
@@ -398,11 +399,9 @@
     // [intersectNullabilities] to compute the resulting type if the subtype
     // relation is established.
     DartType typeWithoutNullabilityMarker1 =
-        computeTypeWithoutNullabilityMarker(type1, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type1, clientLibrary);
     DartType typeWithoutNullabilityMarker2 =
-        computeTypeWithoutNullabilityMarker(type2, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type2, clientLibrary);
     if (isSubtypeOf(typeWithoutNullabilityMarker1,
         typeWithoutNullabilityMarker2, SubtypeCheckMode.withNullabilities)) {
       return type1.withDeclaredNullability(intersectNullabilities(
@@ -466,10 +465,10 @@
       DartType type1, DartType type2, Library clientLibrary) {
     // Do legacy erasure on the argument, so that the result types that are
     // computed from arguments are legacy.
-    type1 = type1 == coreTypes.nullType
+    type1 = type1 is NullType
         ? type1
         : type1.withDeclaredNullability(Nullability.legacy);
-    type2 = type2 == coreTypes.nullType
+    type2 = type2 is NullType
         ? type2
         : type2.withDeclaredNullability(Nullability.legacy);
 
@@ -514,8 +513,8 @@
     // SLB(bottom, T) = SLB(T, bottom) = bottom.
     if (type1 is BottomType) return type1;
     if (type2 is BottomType) return type2;
-    if (type1 == coreTypes.nullType) return type1;
-    if (type2 == coreTypes.nullType) return type2;
+    if (type1 is NullType) return type1;
+    if (type2 is NullType) return type2;
 
     // Function types have structural lower bounds.
     if (type1 is FunctionType && type2 is FunctionType) {
@@ -774,11 +773,9 @@
     // uses [uniteNullabilities] to compute the resulting type if the subtype
     // relation is established.
     InterfaceType typeWithoutNullabilityMarker1 =
-        computeTypeWithoutNullabilityMarker(type1, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type1, clientLibrary);
     InterfaceType typeWithoutNullabilityMarker2 =
-        computeTypeWithoutNullabilityMarker(type2, clientLibrary,
-            nullType: coreTypes.nullType);
+        computeTypeWithoutNullabilityMarker(type2, clientLibrary);
 
     if (isSubtypeOf(typeWithoutNullabilityMarker1,
         typeWithoutNullabilityMarker2, SubtypeCheckMode.withNullabilities)) {
@@ -1277,8 +1274,8 @@
     // SUB(bottom, T) = SUB(T, bottom) = T.
     if (type1 is BottomType) return type2;
     if (type2 is BottomType) return type1;
-    if (type1 == coreTypes.nullType) return type2;
-    if (type2 == coreTypes.nullType) return type1;
+    if (type1 is NullType) return type2;
+    if (type2 is NullType) return type1;
 
     if (type1 is TypeParameterType || type2 is TypeParameterType) {
       return _getNullabilityObliviousTypeParameterStandardUpperBound(
diff --git a/pkg/kernel/lib/src/types.dart b/pkg/kernel/lib/src/types.dart
index 326062f..02a4933 100644
--- a/pkg/kernel/lib/src/types.dart
+++ b/pkg/kernel/lib/src/types.dart
@@ -15,6 +15,7 @@
         Library,
         NamedType,
         NeverType,
+        NullType,
         Nullability,
         TypeParameter,
         TypeParameterType,
@@ -110,6 +111,10 @@
     if (s is NeverType) {
       return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
     }
+    if (s is NullType) {
+      // Rule 4.
+      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
+    }
 
     if (t is InterfaceType) {
       Class cls = t.classNode;
@@ -233,6 +238,25 @@
       } else if (s is FutureOrType) {
         return relation.isFutureOrRelated(s, t, this);
       }
+    } else if (t is NullType) {
+      const IsNullTypeSubtypeOf relation = const IsNullTypeSubtypeOf();
+      if (s is DynamicType) {
+        return relation.isDynamicRelated(s, t, this);
+      } else if (s is VoidType) {
+        return relation.isVoidRelated(s, t, this);
+      } else if (s is InterfaceType) {
+        return relation.isInterfaceRelated(s, t, this);
+      } else if (s is FunctionType) {
+        return relation.isFunctionRelated(s, t, this);
+      } else if (s is TypeParameterType) {
+        return s.promotedBound == null
+            ? relation.isTypeParameterRelated(s, t, this)
+            : relation.isIntersectionRelated(s, t, this);
+      } else if (s is TypedefType) {
+        return relation.isTypedefRelated(s, t, this);
+      } else if (s is FutureOrType) {
+        return relation.isFutureOrRelated(s, t, this);
+      }
     } else if (t is NeverType) {
       const IsNeverTypeSubtypeOf relation = const IsNeverTypeSubtypeOf();
       if (s is DynamicType) {
@@ -293,8 +317,7 @@
 
   InterfaceType getTypeAsInstanceOf(InterfaceType type, Class superclass,
       Library clientLibrary, CoreTypes coreTypes) {
-    return hierarchy.getTypeAsInstanceOf(
-        type, superclass, clientLibrary, coreTypes);
+    return hierarchy.getTypeAsInstanceOf(type, superclass, clientLibrary);
   }
 
   List<DartType> getTypeArgumentsAsInstanceOf(
@@ -343,11 +366,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, InterfaceType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // This is an optimization, to avoid instantiating unnecessary type
-      // arguments in getKernelTypeAsInstanceOf.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     List<DartType> asSupertypeArguments =
         types.hierarchy.getTypeArgumentsAsInstanceOf(s, t.classNode);
     if (asSupertypeArguments == null) {
@@ -546,10 +564,6 @@
 
   @override
   IsSubtypeOf isInterfaceRelated(InterfaceType s, FunctionType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -639,10 +653,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, TypeParameterType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, t);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -873,10 +883,6 @@
   @override
   IsSubtypeOf isInterfaceRelated(
       InterfaceType s, TypeParameterType intersection, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      // Rule 4.
-      return new IsSubtypeOf.basedSolelyOnNullabilities(s, intersection);
-    }
     return const IsSubtypeOf.never();
   }
 
@@ -912,6 +918,48 @@
   }
 }
 
+class IsNullTypeSubtypeOf implements TypeRelation<NullType> {
+  const IsNullTypeSubtypeOf();
+
+  IsSubtypeOf isDynamicRelated(DynamicType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isVoidRelated(VoidType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isInterfaceRelated(InterfaceType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isIntersectionRelated(
+      TypeParameterType intersection, NullType t, Types types) {
+    return types.performNullabilityAwareMutualSubtypesCheck(
+        intersection.promotedBound, t);
+  }
+
+  IsSubtypeOf isFunctionRelated(FunctionType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isFutureOrRelated(FutureOrType s, NullType t, Types types) {
+    return const IsSubtypeOf.never();
+  }
+
+  IsSubtypeOf isTypeParameterRelated(
+      TypeParameterType s, NullType t, Types types) {
+    // We don't need to combine the check of the bound against [t] with the
+    // check of the nullability of [s] against the nullability of [t] because
+    // [t] is always nullable.
+    return types.performNullabilityAwareSubtypeCheck(s.bound, t);
+  }
+
+  IsSubtypeOf isTypedefRelated(TypedefType s, NullType t, Types types) {
+    return types.performNullabilityAwareSubtypeCheck(s.unalias, t);
+  }
+}
+
 class IsNeverTypeSubtypeOf implements TypeRelation<NeverType> {
   const IsNeverTypeSubtypeOf();
 
@@ -924,18 +972,6 @@
   }
 
   IsSubtypeOf isInterfaceRelated(InterfaceType s, NeverType t, Types types) {
-    if (s.classNode == types.hierarchy.coreTypes.nullClass) {
-      if (t.nullability == Nullability.nullable ||
-          t.nullability == Nullability.legacy) {
-        return const IsSubtypeOf.always();
-      }
-      if (t.nullability == Nullability.nonNullable) {
-        return new IsSubtypeOf.onlyIfIgnoringNullabilities(
-            subtype: s, supertype: t);
-      }
-      throw new StateError(
-          "Unexpected nullability '$t.nullability' of type Never");
-    }
     return const IsSubtypeOf.never();
   }
 
diff --git a/pkg/kernel/lib/testing/type_parser_environment.dart b/pkg/kernel/lib/testing/type_parser_environment.dart
index 10ffc59f..8989064 100644
--- a/pkg/kernel/lib/testing/type_parser_environment.dart
+++ b/pkg/kernel/lib/testing/type_parser_environment.dart
@@ -16,6 +16,7 @@
         NamedType,
         NeverType,
         Node,
+        NullType,
         Nullability,
         Supertype,
         TreeNode,
@@ -232,6 +233,10 @@
       // Don't return a const object to ensure we test implementations that use
       // identical.
       return new NeverType(interpretParsedNullability(node.parsedNullability));
+    } else if (name == "Null") {
+      // Don't return a const object to ensure we test implementations that use
+      // identical.
+      return new NullType();
     }
     TreeNode declaration = environment.lookupDeclaration(name);
     List<ParsedType> arguments = node.arguments;
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index d13d0c9..1e05d07 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -2167,6 +2167,10 @@
     writeNullability(node.nullability);
   }
 
+  visitNullType(NullType node) {
+    writeWord('Null');
+  }
+
   visitInterfaceType(InterfaceType node) {
     writeClassReferenceFromReference(node.className);
     if (node.typeArguments.isNotEmpty) {
diff --git a/pkg/kernel/lib/text/text_serializer.dart b/pkg/kernel/lib/text/text_serializer.dart
index 5d12e73..42b5bda 100644
--- a/pkg/kernel/lib/text/text_serializer.dart
+++ b/pkg/kernel/lib/text/text_serializer.dart
@@ -822,6 +822,7 @@
   String visitNeverType(NeverType _) => "never";
   String visitTypedefType(TypedefType _) => "typedef";
   String visitFutureOrType(FutureOrType _) => "futureor";
+  String visitNullType(NullType _) => "null-type";
 }
 
 const TextSerializer<InvalidType> invalidTypeSerializer =
@@ -961,6 +962,13 @@
   return new FutureOrType(typeArgument, Nullability.legacy);
 }
 
+TextSerializer<NullType> nullTypeSerializer =
+    new Wrapped(unwrapNullType, wrapNullType, const Nothing());
+
+void unwrapNullType(NullType type) {}
+
+NullType wrapNullType(void ignored) => const NullType();
+
 Case<DartType> dartTypeSerializer =
     new Case.uninitialized(const DartTypeTagger());
 
@@ -2065,6 +2073,7 @@
     "never": neverTypeSerializer,
     "typedef": typedefTypeSerializer,
     "futureor": futureOrTypeSerializer,
+    "null-type": nullTypeSerializer,
   });
   statementSerializer.registerTags({
     "expr": expressionStatementSerializer,
diff --git a/pkg/kernel/lib/type_algebra.dart b/pkg/kernel/lib/type_algebra.dart
index dccad1c..b9ca3949 100644
--- a/pkg/kernel/lib/type_algebra.dart
+++ b/pkg/kernel/lib/type_algebra.dart
@@ -503,6 +503,7 @@
   DartType visitVoidType(VoidType node) => node;
   DartType visitBottomType(BottomType node) => node;
   DartType visitNeverType(NeverType node) => node;
+  DartType visitNullType(NullType node) => node;
 
   DartType visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) return node;
@@ -839,6 +840,7 @@
 
   bool visitBottomType(BottomType node) => false;
   bool visitNeverType(NeverType node) => false;
+  bool visitNullType(NullType node) => false;
   bool visitInvalidType(InvalidType node) => false;
   bool visitDynamicType(DynamicType node) => false;
   bool visitVoidType(VoidType node) => false;
@@ -891,6 +893,7 @@
 
   bool visitBottomType(BottomType node) => false;
   bool visitNeverType(NeverType node) => false;
+  bool visitNullType(NullType node) => false;
   bool visitInvalidType(InvalidType node) => false;
   bool visitDynamicType(DynamicType node) => false;
   bool visitVoidType(VoidType node) => false;
@@ -1011,6 +1014,9 @@
   bool visitNeverType(NeverType node) => true;
 
   @override
+  bool visitNullType(NullType node) => true;
+
+  @override
   bool visitTypeParameterType(TypeParameterType node) {
     return node.promotedBound == null;
   }
@@ -1067,9 +1073,7 @@
 
   @override
   DartType visitInterfaceType(InterfaceType node, CoreTypes coreTypes) {
-    return node == coreTypes.nullType
-        ? node
-        : node.withDeclaredNullability(Nullability.nonNullable);
+    return node.withDeclaredNullability(Nullability.nonNullable);
   }
 
   @override
@@ -1081,6 +1085,9 @@
   }
 
   @override
+  DartType visitNullType(NullType node, CoreTypes coreTypes) => node;
+
+  @override
   DartType visitTypeParameterType(TypeParameterType node, CoreTypes coreTypes) {
     if (node.promotedBound != null) {
       // Intersection types don't have their own nullabilities.
@@ -1197,9 +1204,7 @@
 /// [TypeParameterType]s, the result may be either [Nullability.nonNullable] or
 /// [Nullability.undetermined], depending on the bound.
 DartType computeTypeWithoutNullabilityMarker(
-    DartType type, Library clientLibrary,
-    {DartType nullType}) {
-  assert(nullType != null);
+    DartType type, Library clientLibrary) {
   if (type is TypeParameterType) {
     if (type.promotedBound == null) {
       // The default nullability for library is used when there are no
@@ -1211,7 +1216,7 @@
       // type constructors, so nothing can be peeled off.
       return type;
     }
-  } else if (type == nullType) {
+  } else if (type is NullType) {
     return type;
   } else {
     // For most types, peeling off the nullability constructors means that
@@ -1244,12 +1249,11 @@
 /// String?, Object?, and T? where T is a type parameter.  Types dynamic, void,
 /// and Null are nullable, but aren't considered applications of the nullable
 /// type constructor.
-bool isNullableTypeConstructorApplication(DartType type, {DartType nullType}) {
-  assert(nullType != null);
+bool isNullableTypeConstructorApplication(DartType type) {
   return type.declaredNullability == Nullability.nullable &&
       type is! DynamicType &&
       type is! VoidType &&
-      type != nullType;
+      type is! NullType;
 }
 
 /// Returns true if [type] is an application of the legacy type constructor.
diff --git a/pkg/kernel/lib/type_checker.dart b/pkg/kernel/lib/type_checker.dart
index ff94bf8..2106e8e 100644
--- a/pkg/kernel/lib/type_checker.dart
+++ b/pkg/kernel/lib/type_checker.dart
@@ -249,7 +249,7 @@
     while (type is TypeParameterType) {
       type = (type as TypeParameterType).bound;
     }
-    if (type is BottomType || type is NeverType || type == coreTypes.nullType) {
+    if (type is BottomType || type is NeverType || type is NullType) {
       // The bottom type is a subtype of all types, so it should be allowed.
       return Substitution.bottomForClass(superclass);
     }
diff --git a/pkg/kernel/lib/type_environment.dart b/pkg/kernel/lib/type_environment.dart
index 8967df1..7e0dedc 100644
--- a/pkg/kernel/lib/type_environment.dart
+++ b/pkg/kernel/lib/type_environment.dart
@@ -36,7 +36,6 @@
 
   InterfaceType get objectLegacyRawType => coreTypes.objectLegacyRawType;
   InterfaceType get objectNullableRawType => coreTypes.objectNullableRawType;
-  InterfaceType get nullType => coreTypes.nullType;
   InterfaceType get functionLegacyRawType => coreTypes.functionLegacyRawType;
 
   /// Returns the type `List<E>` with the given [nullability] and [elementType]
@@ -82,7 +81,7 @@
   }
 
   DartType _withDeclaredNullability(DartType type, Nullability nullability) {
-    if (type == nullType) return type;
+    if (type is NullType) return type;
     return type.withDeclaredNullability(
         uniteNullabilities(type.declaredNullability, nullability));
   }
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 5cbe74c..1fec5a3 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -273,6 +273,7 @@
   R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
   R visitTypedefType(TypedefType node) => defaultDartType(node);
   R visitNeverType(NeverType node) => defaultDartType(node);
+  R visitNullType(NullType node) => defaultDartType(node);
 }
 
 class DartTypeVisitor1<R, T> {
@@ -289,6 +290,7 @@
       defaultDartType(node, arg);
   R visitTypedefType(TypedefType node, T arg) => defaultDartType(node, arg);
   R visitNeverType(NeverType node, T arg) => defaultDartType(node, arg);
+  R visitNullType(NullType node, T arg) => defaultDartType(node, arg);
 }
 
 /// Visitor for [Constant] nodes.
@@ -526,6 +528,7 @@
   R visitTypeParameterType(TypeParameterType node) => defaultDartType(node);
   R visitTypedefType(TypedefType node) => defaultDartType(node);
   R visitNeverType(NeverType node) => defaultDartType(node);
+  R visitNullType(NullType node) => defaultDartType(node);
 
   // Constants
   R defaultConstant(Constant node) => defaultNode(node);
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 613f5f7..bd0ad7a 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -1216,10 +1216,9 @@
 ''');
 
     var b_int = new InterfaceType(b, Nullability.legacy, [int]);
-    expect(hierarchy.getTypeAsInstanceOf(b_int, a, library, coreTypes),
+    expect(hierarchy.getTypeAsInstanceOf(b_int, a, library),
         new InterfaceType(a, Nullability.legacy, [int, bool]));
-    expect(
-        hierarchy.getTypeAsInstanceOf(b_int, objectClass, library, coreTypes),
+    expect(hierarchy.getTypeAsInstanceOf(b_int, objectClass, library),
         new InterfaceType(objectClass, Nullability.legacy));
   }
 
diff --git a/pkg/kernel/test/non_null_test.dart b/pkg/kernel/test/non_null_test.dart
index 1158a4e..77750c8 100644
--- a/pkg/kernel/test/non_null_test.dart
+++ b/pkg/kernel/test/non_null_test.dart
@@ -82,7 +82,7 @@
   data.forEach((String input, String output) {
     DartType inputType = env.parseType(input);
     DartType expectedOutputType = env.parseType(output);
-    DartType actualOutputType = computeNonNull(env.coreTypes, inputType);
+    DartType actualOutputType = computeNonNull(inputType);
     print('legacyErasure($inputType) = $actualOutputType: $expectedOutputType');
     Expect.equals(
         expectedOutputType,
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 904f915..245d77d 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -243,9 +243,7 @@
               NullLiteral(), // valueOf
               NullLiteral(), // enumValues
             ],
-            types: <DartType>[
-              InterfaceType(coreTypes.nullClass, Nullability.nullable)
-            ],
+            types: <DartType>[const NullType()],
           ),
         );
       }
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index d36d3be..36da3b6 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -529,7 +529,8 @@
   // TODO(alexmarkov): Consider caching targets for Null type.
   void _collectTargetsForNull(Map<Member, _ReceiverTypeBuilder> targets,
       TypeFlowAnalysis typeFlowAnalysis) {
-    Class nullClass = typeFlowAnalysis.environment.coreTypes.nullClass;
+    Class nullClass =
+        typeFlowAnalysis.environment.coreTypes.deprecatedNullClass;
 
     Member target = typeFlowAnalysis.hierarchyCache.hierarchy
         .getDispatchTarget(nullClass, selector.name, setter: selector.isSetter);
diff --git a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
index 334eb84..7643e45 100644
--- a/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
+++ b/pkg/vm/lib/transformations/type_flow/protobuf_handler.dart
@@ -192,7 +192,7 @@
             NullLiteral(), // valueOf
             NullLiteral(), // enumValues
           ],
-          types: <DartType>[ph.coreTypes.nullType],
+          types: <DartType>[const NullType()],
         ),
         ph._builderInfoAddMethod)
       ..fileOffset = node.fileOffset;
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 64170aa..68162e7 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -587,10 +587,10 @@
     assert(_genericInterfacesInfo != null);
     constantAllocationCollector = new ConstantAllocationCollector(this);
     _nullMethodsAndGetters.addAll(getSelectors(
-        _hierarchy, _environment.coreTypes.nullClass,
+        _hierarchy, _environment.coreTypes.deprecatedNullClass,
         setters: false));
     _nullSetters.addAll(getSelectors(
-        _hierarchy, _environment.coreTypes.nullClass,
+        _hierarchy, _environment.coreTypes.deprecatedNullClass,
         setters: true));
   }
 
diff --git a/pkg/vm/lib/transformations/type_flow/transformer.dart b/pkg/vm/lib/transformations/type_flow/transformer.dart
index de5576f..68688fd 100644
--- a/pkg/vm/lib/transformations/type_flow/transformer.dart
+++ b/pkg/vm/lib/transformations/type_flow/transformer.dart
@@ -195,7 +195,8 @@
     }
 
     if (nullable && type == const EmptyType()) {
-      concreteClass = _typeFlowAnalysis.environment.coreTypes.nullClass;
+      concreteClass =
+          _typeFlowAnalysis.environment.coreTypes.deprecatedNullClass;
       constantValue = _nullConstant ??= new NullConstant();
     } else {
       concreteClass = type.getConcreteClass(_typeFlowAnalysis.hierarchyCache);
diff --git a/pkg/vm/lib/transformations/type_flow/types.dart b/pkg/vm/lib/transformations/type_flow/types.dart
index e7e0c1d..c5754ed 100644
--- a/pkg/vm/lib/transformations/type_flow/types.dart
+++ b/pkg/vm/lib/transformations/type_flow/types.dart
@@ -79,12 +79,12 @@
     Type result;
     if (type is InterfaceType) {
       final cls = type.classNode;
-      result = (cls == coreTypes.nullClass)
-          ? const EmptyType()
-          : new ConeType(getTFClass(cls));
+      result = new ConeType(getTFClass(cls));
     } else if (type == const DynamicType() || type == const VoidType()) {
       result = const AnyType();
-    } else if (type == const BottomType() || type is NeverType) {
+    } else if (type == const BottomType() ||
+        type is NeverType ||
+        type is NullType) {
       result = const EmptyType();
     } else if (type is FunctionType) {
       // TODO(alexmarkov): support function types
diff --git a/pkg/vm/test/transformations/type_flow/types_test.dart b/pkg/vm/test/transformations/type_flow/types_test.dart
index 27c288d..326ce81 100644
--- a/pkg/vm/test/transformations/type_flow/types_test.dart
+++ b/pkg/vm/test/transformations/type_flow/types_test.dart
@@ -66,8 +66,7 @@
     final InterfaceType t2Raw = new InterfaceType(c2, Nullability.legacy);
     final InterfaceType t2Generic =
         new InterfaceType(c2, Nullability.legacy, [t1]);
-    final InterfaceType t3 =
-        new InterfaceType(coreTypes.nullClass, Nullability.nullable);
+    final DartType t3 = const NullType();
     final FunctionType f1 =
         new FunctionType([t1], const VoidType(), Nullability.legacy);
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
index ad7ce96..8726004 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/create_test.dart.expect
@@ -18,7 +18,7 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test("retrieving values", () → core::Null? {
+  tes::test("retrieving values", () → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.hasHasKeep] [@vm.inferred-type.metadata=dart.core::bool (skip check)] foo.{pb::FooKeep::hasHasKeep}(), false);
@@ -37,9 +37,9 @@
 class FooKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
@@ -82,7 +82,7 @@
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep*
@@ -105,7 +105,7 @@
 }
 class HasKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -119,7 +119,7 @@
 }
 class ClearKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
index a65b51a..f59d5b9 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/decode_test.dart.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "generated/foo.pb.dart" as pb;
 import "package:test_core/test_core.dart" as tes;
-import "dart:core" as core;
 import "package:test_api/src/frontend/expect.dart" as exp;
+import "dart:core" as core;
 
 import "package:test/test.dart";
 import "file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart";
@@ -11,7 +11,7 @@
 [@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>]static field core::List<core::int*>* buffer = <core::int*>[10, 4, 8, 5, 16, 4, 26, 9, 10, 3, 102, 111, 111, 18, 2, 8, 42, 34, 9, 10, 3, 122, 111, 112, 18, 2, 8, 3, 40, 43, 50, 0, 58, 0];
 static method main() → dynamic {
   pb::FooKeep* foo = [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep] pb::FooKeep::fromBuffer([@vm.inferred-type.metadata=dart.core::_GrowableList?<dart.core::int*>] self::buffer);
-  tes::test("Kept values are restored correctly", () → core::Null? {
+  tes::test("Kept values are restored correctly", () → Null {
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 42);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=int] foo.{pb::FooKeep::aKeep}, 43);
@@ -30,9 +30,9 @@
 class FooKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
@@ -75,7 +75,7 @@
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("BarKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::BarKeep*
@@ -98,7 +98,7 @@
 }
 class HasKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t6 = new pro::BuilderInfo::•("HasKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t6.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t6;
   constructor _() → self::HasKeep*
@@ -118,7 +118,7 @@
 }
 class ClearKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t8 = new pro::BuilderInfo::•("ClearKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t8.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t8;
   constructor _() → self::ClearKeep*
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
index 22768c2..66a360a 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/encode_all_fields.dart.expect
@@ -44,7 +44,7 @@
 class FooKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::ZopDrop*>(4, "mapDrop", "FooKeep.MapDropEntry", #C2, "mapDrop", #C4, #C3);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C5);
@@ -112,7 +112,7 @@
 }
 class HasKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -128,7 +128,7 @@
 }
 class ClearKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
index 15020be..6423786 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/freeze_test.dart.expect
@@ -21,7 +21,7 @@
     } =>#t3);
     [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.aKeep] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pb::FooKeep::aKeep} = 43;
   } =>#t1;
-  tes::test("Freezing a message works", () → core::Null? {
+  tes::test("Freezing a message works", () → Null {
     [@vm.direct-call.metadata=protobuf::GeneratedMessage.freeze] [@vm.inferred-type.metadata=!? (skip check)] foo.{pro::GeneratedMessage::freeze}();
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.barKeep] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] foo.{pb::FooKeep::barKeep}.{pb::BarKeep::aKeep}, 5);
     exp::expect([@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep.aKeep??] [@vm.inferred-type.metadata=int] [@vm.inferred-type.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::BarKeep?] [@vm.direct-call.metadata=library file:pkg/vm/testcases/transformations/type_flow/transformer/protobuf_handler/lib/generated/foo.pb.dart::FooKeep.mapKeep] [@vm.inferred-type.metadata=!] foo.{pb::FooKeep::mapKeep}.{core::Map::[]}("foo").{pb::BarKeep::aKeep}, 2);
@@ -41,9 +41,9 @@
 class FooKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t1 = new pro::BuilderInfo::•("FooKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::BarKeep*>(1, "barKeep", #C1);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.m] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::m}<core::String*, self::BarKeep*>(3, "mapKeep", "FooKeep.MapKeepEntry", #C2, "mapKeep", #C1, #C3);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::a}<core::int*>(5, "aKeep", #C4);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::HasKeep*>(6, "hasKeep", #C5);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.aOM] [@vm.inferred-type.metadata=!? (skip check)] #t1.{pro::BuilderInfo::aOM}<self::ClearKeep*>(7, "clearKeep", #C6);
@@ -86,7 +86,7 @@
 class BarKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t2 = new pro::BuilderInfo::•("BarKeep") in block {
     [@vm.direct-call.metadata=protobuf::BuilderInfo.a] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::a}<core::int*>(1, "aKeep", #C4);
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t2.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t2;
   constructor _() → self::BarKeep*
@@ -109,7 +109,7 @@
 }
 class HasKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t3 = new pro::BuilderInfo::•("HasKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t3.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t3;
   constructor _() → self::HasKeep*
@@ -123,7 +123,7 @@
 }
 class ClearKeep extends pro::GeneratedMessage {
 [@vm.inferred-type.metadata=protobuf::BuilderInfo?]  static final field pro::BuilderInfo* _i = let final pro::BuilderInfo* #t4 = new pro::BuilderInfo::•("ClearKeep") in block {
-    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<core::Null?>(0, null, null, null, null, null, null);
+    [@vm.direct-call.metadata=protobuf::BuilderInfo.add] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::add}<Null>(0, null, null, null, null, null, null);
     [@vm.direct-call.metadata=protobuf::BuilderInfo.hasRequiredFields] [@vm.inferred-type.metadata=!? (skip check)] #t4.{pro::BuilderInfo::hasRequiredFields} = false;
   } =>#t4;
   constructor _() → self::ClearKeep*
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
index 936781a..c2f2f87 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/write_only_field2.dart.expect
@@ -57,7 +57,7 @@
   new self::A::•();
   new self::B::•();
   self::C<core::num*>* c = new self::D::•();
-  exp::Expect::throws<dynamic>(() → core::Null? {
+  exp::Expect::throws<dynamic>(() → Null {
     [@vm.call-site-attributes.metadata=receiverType:#lib::C<dart.core::num*>*] [@vm.direct-call.metadata=#lib::D.bar] c.{self::C::bar} = 3.14;
   });
   self::E* e = new self::F::•();