Version 2.10.0-19.0.dev

Merge commit '78250735aafd8a71356995328ffdffdbb1aaf94e' into 'dev'
diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json
index 10b2831..78aa0a4 100644
--- a/.dart_tool/package_config.json
+++ b/.dart_tool/package_config.json
@@ -11,7 +11,7 @@
     "constraint, update this by running tools/generate_package_config.dart."
   ],
   "configVersion": 2,
-  "generated": "2020-08-11T10:59:54.661195",
+  "generated": "2020-08-12T09:00:03.727658",
   "generator": "tools/generate_package_config.dart",
   "packages": [
     {
@@ -299,6 +299,11 @@
       "packageUri": ".nonexisting/"
     },
     {
+      "name": "front_end_value_class",
+      "rootUri": "../pkg/front_end/testcases/value_class",
+      "packageUri": ".nonexisting/"
+    },
+    {
       "name": "frontend_server",
       "rootUri": "../pkg/frontend_server",
       "packageUri": "lib/",
diff --git a/DEPS b/DEPS
index 0a1e7ec..2906f58 100644
--- a/DEPS
+++ b/DEPS
@@ -137,7 +137,7 @@
   "shelf_static_rev": "v0.2.8",
   "shelf_packages_handler_tag": "2.0.0",
   "shelf_proxy_tag": "0.1.0+7",
-  "shelf_tag": "0.7.3+3",
+  "shelf_rev": "289309adc6c39aab0a63db676d550c517fc1cc2d",
   "shelf_web_socket_tag": "0.2.2+3",
   "source_map_stack_trace_rev": "1c3026f69d9771acf2f8c176a1ab750463309cce",
   "source_maps-0.9.4_rev": "38524",
@@ -394,7 +394,7 @@
   Var("dart_root") + "/third_party/pkg/resource":
       Var("dart_git") + "resource.git" + "@" + Var("resource_rev"),
   Var("dart_root") + "/third_party/pkg/shelf":
-      Var("dart_git") + "shelf.git" + "@" + Var("shelf_tag"),
+      Var("dart_git") + "shelf.git" + "@" + Var("shelf_rev"),
   Var("dart_root") + "/third_party/pkg/shelf_packages_handler":
       Var("dart_git") + "shelf_packages_handler.git"
       + "@" + Var("shelf_packages_handler_tag"),
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index abe46be..a9fbc91 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -203,6 +203,10 @@
   /// A flag indicating whether local fields should be suggested.
   final bool suggestLocalFields;
 
+  /// A flag indicating whether suggestions are being made inside an `extends`
+  /// clause.
+  bool inExtendsClause = false;
+
   /// Only used when [useNewRelevance] is `false`.
   int privateMemberRelevance = DART_RELEVANCE_DEFAULT;
 
@@ -404,7 +408,8 @@
 
   @override
   void declaredMixin(MixinDeclaration declaration) {
-    if (visibilityTracker._isVisible(declaration.declaredElement) &&
+    if (!inExtendsClause &&
+        visibilityTracker._isVisible(declaration.declaredElement) &&
         opType.includeTypeNameSuggestions) {
       builder.suggestClass(declaration.declaredElement, kind: _defaultKind);
     }
@@ -445,6 +450,12 @@
     }
   }
 
+  @override
+  void visitExtendsClause(ExtendsClause node) {
+    inExtendsClause = true;
+    return super.visitExtendsClause(node);
+  }
+
   /// Return `true` if the [identifier] is composed of one or more underscore
   /// characters and nothing else.
   bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
diff --git a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
index 059880a..27138b1 100644
--- a/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/bulk_fix_processor.dart
@@ -15,6 +15,8 @@
 import 'package:analysis_server/src/services/correction/dart/convert_documentation_into_line.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_quotes.dart';
 import 'package:analysis_server/src/services/correction/dart/convert_to_contains.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_generic_function_syntax.dart';
+import 'package:analysis_server/src/services/correction/dart/convert_to_if_null.dart';
 import 'package:analysis_server/src/services/correction/dart/create_method.dart';
 import 'package:analysis_server/src/services/correction/dart/make_final.dart';
 import 'package:analysis_server/src/services/correction/dart/remove_argument.dart';
@@ -81,8 +83,11 @@
     LintNames.prefer_equal_for_default_values:
         ReplaceColonWithEquals.newInstance,
     LintNames.prefer_final_fields: MakeFinal.newInstance,
+    LintNames.prefer_generic_function_type_aliases:
+        ConvertToGenericFunctionSyntax.newInstance,
     LintNames.prefer_if_elements_to_conditional_expressions:
         ConvertConditionalExpressionToIfElement.newInstance,
+    LintNames.prefer_if_null_operators: ConvertToIfNull.newInstance,
     LintNames.prefer_is_empty: ReplaceWithIsEmpty.newInstance,
     LintNames.prefer_is_not_empty: UesIsNotEmpty.newInstance,
     LintNames.prefer_single_quotes: ConvertToSingleQuotes.newInstance,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
index 62ff87c..23594f4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/data_driven.dart
@@ -42,13 +42,22 @@
     return <TransformSet>[];
   }
 
-  /// Return the name that was changed.
+  /// Return the name of the element that was changed.
   String get _name {
     var node = this.node;
     if (node is SimpleIdentifier) {
       return node.name;
     } else if (node is ConstructorName) {
       return node.name.name;
+    } else if (node is NamedType) {
+      return node.name.name;
+    } else if (node is TypeArgumentList) {
+      var parent = node.parent;
+      if (parent is MethodInvocation) {
+        return parent.methodName.name;
+      } else if (parent is ExtensionOverride) {
+        return parent.extensionName.name;
+      }
     }
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart
new file mode 100644
index 0000000..edc2312
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/add_type_parameter_change.dart
@@ -0,0 +1,178 @@
+// 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.
+
+import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:meta/meta.dart';
+
+/// The data related to a type parameter that was added to either a function or
+/// a type.
+class AddTypeParameterChange extends Change<_Data> {
+  /// The index of the type parameter that was added.
+  final int index;
+
+  /// The name of the type parameter that was added.
+  final String name;
+
+  /// The name of the type that the type parameter extends, or `null` if the
+  /// type parameter doesn't have a bound.
+  final String extendedType;
+
+  /// The value extractor used to compute the value of the type argument.
+  final ValueExtractor value;
+
+  /// Initialize a newly created change to describe adding a type parameter to a
+  /// type or a function.
+  // TODO(brianwilkerson) Support adding multiple type parameters.
+  AddTypeParameterChange(
+      {@required this.index,
+      @required this.name,
+      @required this.value,
+      this.extendedType})
+      : assert(index >= 0),
+        assert(name != null),
+        assert(value != null);
+
+  @override
+  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
+    if (data is _TypeArgumentData) {
+      _applyToTypeArguments(builder, data);
+    } else {
+      _applyToTypeParameters(builder, data as _TypeParameterData);
+    }
+  }
+
+  @override
+  _Data validate(DataDrivenFix fix) {
+    var node = fix.node;
+    if (node is NamedType) {
+      // wrong_number_of_type_arguments
+      // wrong_number_of_type_arguments_constructor
+      var argument = value.from(node, fix.utils);
+      if (argument == null) {
+        return null;
+      }
+      var typeArguments = node.typeArguments;
+      if (_isInvalidIndex(typeArguments?.arguments)) {
+        return null;
+      }
+      return _TypeArgumentData(typeArguments, argument, node.name.end);
+    }
+    var parent = node.parent;
+    if (parent is InvocationExpression) {
+      // wrong_number_of_type_arguments_method
+      var argument = value.from(parent, fix.utils);
+      if (argument == null) {
+        return null;
+      }
+      var typeArguments = parent.typeArguments;
+      if (_isInvalidIndex(typeArguments?.arguments)) {
+        return null;
+      }
+      return _TypeArgumentData(
+          typeArguments, argument, parent.argumentList.offset);
+    } else if (parent is MethodDeclaration) {
+      // invalid_override
+      var typeParameters = parent.typeParameters;
+      if (_isInvalidIndex(typeParameters?.typeParameters)) {
+        return null;
+      }
+      return _TypeParameterData(typeParameters, parent.name.end);
+    } else if (node is TypeArgumentList && parent is ExtensionOverride) {
+      // wrong_number_of_type_arguments_extension
+      var argument = value.from(node, fix.utils);
+      if (argument == null) {
+        return null;
+      }
+      if (_isInvalidIndex(node?.arguments)) {
+        return null;
+      }
+      return _TypeArgumentData(node, argument, parent.extensionName.end);
+    }
+    return null;
+  }
+
+  void _applyToTypeArguments(
+      DartFileEditBuilder builder, _TypeArgumentData data) {
+    var typeArguments = data.typeArguments;
+    var argumentValue = data.argumentValue;
+    if (typeArguments == null) {
+      // Adding the first type argument.
+      builder.addSimpleInsertion(data.newListOffset, '<$argumentValue>');
+    } else {
+      if (index == 0) {
+        // Inserting the type argument at the beginning of the list.
+        builder.addSimpleInsertion(
+            typeArguments.leftBracket.end, '$argumentValue, ');
+      } else {
+        // Inserting the type argument after an existing type argument.
+        var previous = typeArguments.arguments[index - 1];
+        builder.addSimpleInsertion(previous.end, ', $argumentValue');
+      }
+    }
+  }
+
+  void _applyToTypeParameters(
+      DartFileEditBuilder builder, _TypeParameterData data) {
+    var argumentValue =
+        extendedType == null ? name : '$name extends $extendedType';
+    var typeParameters = data.typeParameters;
+    if (typeParameters == null) {
+      // Adding the first type argument.
+      builder.addSimpleInsertion(data.newListOffset, '<$argumentValue>');
+    } else {
+      if (index == 0) {
+        // Inserting the type argument at the beginning of the list.
+        builder.addSimpleInsertion(
+            typeParameters.leftBracket.end, '$argumentValue, ');
+      } else {
+        // Inserting the type argument after an existing type argument.
+        var previous = typeParameters.typeParameters[index - 1];
+        builder.addSimpleInsertion(previous.end, ', $argumentValue');
+      }
+    }
+  }
+
+  bool _isInvalidIndex(List<AstNode> list) {
+    var length = list == null ? 0 : list.length;
+    return index > length;
+  }
+}
+
+/// The data returned when adding a type parameter.
+class _Data {}
+
+/// The data returned when updating a type argument list.
+class _TypeArgumentData extends _Data {
+  /// The list of type arguments to which a new type argument is being added, or
+  /// `null` if the first type argument is being added.
+  final TypeArgumentList typeArguments;
+
+  /// The value of the type argument being added.
+  final String argumentValue;
+
+  /// The offset at which the type argument list should be inserted if
+  /// [typeArguments] is `null`.
+  final int newListOffset;
+
+  /// Initialize newly created data.
+  _TypeArgumentData(this.typeArguments, this.argumentValue, this.newListOffset);
+}
+
+/// The data returned when updating a type parameter list.
+class _TypeParameterData extends _Data {
+  /// The list of type parameters to which a new type paramete is being added,
+  /// or `null` if the first type parameter is being added.
+  final TypeParameterList typeParameters;
+
+  /// The offset at which the type parameter list should be inserted if
+  /// [typeParameters] is `null`.
+  final int newListOffset;
+
+  /// Initialize newly created data.
+  _TypeParameterData(this.typeParameters, this.newListOffset);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart
deleted file mode 100644
index 80649d4..0000000
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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.
-
-import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
-import 'package:analyzer_plugin/utilities/range_factory.dart';
-import 'package:meta/meta.dart';
-
-/// The data related to a function for which one of the `Type` valued arguments
-/// has been converted into a type argument.
-class ConvertArgumentToTypeArgumentChange extends Change<_Data> {
-  /// The index of the argument that was transformed.
-  final ParameterReference parameterReference;
-
-  /// The index of the type argument into which the argument was transformed.
-  final int typeArgumentIndex;
-
-  /// Initialize a newly created transform to describe a conversion of the
-  /// argument at the [argumentIndex] to the type parameter at the
-  /// [typeArgumentIndex] for the function [element].
-  ConvertArgumentToTypeArgumentChange(
-      {@required this.parameterReference, @required this.typeArgumentIndex})
-      : assert(parameterReference != null),
-        assert(typeArgumentIndex >= 0);
-
-  @override
-  void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
-    var typeArguments = data.typeArguments;
-    var typeName = data.argumentValue;
-    if (typeArguments == null) {
-      // Adding the first type argument.
-      builder.addSimpleInsertion(
-          data.argumentList.offset, '<${typeName.name}>');
-    } else {
-      if (typeArgumentIndex == 0) {
-        // Inserting the type argument at the beginning of the list.
-        builder.addSimpleInsertion(
-            typeArguments.leftBracket.end, '${typeName.name}, ');
-      } else {
-        // Inserting the type argument after an existing type argument.
-        var previous = typeArguments.arguments[typeArgumentIndex - 1];
-        builder.addSimpleInsertion(previous.end, ', ${typeName.name}');
-      }
-    }
-    builder.addDeletion(range.nodeInList(data.arguments, data.argument));
-  }
-
-  @override
-  _Data validate(DataDrivenFix fix) {
-    var parent = fix.node.parent;
-    if (parent is MethodInvocation) {
-      var argumentList = parent.argumentList;
-      var argument = parameterReference.argumentFrom(argumentList);
-      if (argument is! SimpleIdentifier) {
-        return null;
-      }
-      var typeArguments = parent.typeArguments;
-      var typeArgumentLength =
-          typeArguments == null ? 0 : typeArguments.arguments.length;
-      if (typeArgumentIndex > typeArgumentLength) {
-        return null;
-      }
-      return _Data(argumentList, argument, typeArguments);
-    }
-    return null;
-  }
-}
-
-class _Data {
-  /// The argument list of the invocation.
-  final ArgumentList argumentList;
-
-  /// The value of the argument being moved to the list of type arguments.
-  final Identifier argumentValue;
-
-  /// The list of type arguments for the invocation, or `null` if the invocation
-  /// does not have any type arguments.
-  final TypeArgumentList typeArguments;
-
-  _Data(this.argumentList, this.argumentValue, this.typeArguments);
-
-  /// Return the argument being moved to the list of type arguments.
-  Expression get argument {
-    var parent = argumentValue.parent;
-    if (parent is NamedExpression) {
-      return parent;
-    }
-    return argumentValue;
-  }
-
-  /// The list of invocation arguments.
-  NodeList<Expression> get arguments => argumentList.arguments;
-}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
new file mode 100644
index 0000000..704eae8
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/value_extractor.dart
@@ -0,0 +1,49 @@
+// 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.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+
+/// A value extractor used to extract a specified argument of an invocation.
+class ArgumentExtractor extends ValueExtractor {
+  /// The parameter that defines the argument to be extracted.
+  final ParameterReference parameter;
+
+  /// Initialize a newly created extractor to extract the argument that
+  /// corresponds to the given [parameter].
+  ArgumentExtractor(this.parameter);
+
+  @override
+  String from(AstNode node, CorrectionUtils utils) {
+    if (node is InvocationExpression) {
+      var expression = parameter.argumentFrom(node.argumentList);
+      if (expression != null) {
+        return utils.getNodeText(expression);
+      }
+    }
+    return null;
+  }
+}
+
+/// A value extractor that returns a pre-computed piece of code.
+class LiteralExtractor extends ValueExtractor {
+  /// The code to be returned.
+  final String code;
+
+  /// Initialize a newly created  extractor to return the given [code].
+  LiteralExtractor(this.code);
+
+  @override
+  String from(AstNode node, CorrectionUtils utils) {
+    return code;
+  }
+}
+
+/// An object used to extract an expression from an AST node.
+abstract class ValueExtractor {
+  /// Return code extracted from the given [node], or `null` if no code could be
+  /// extracted.
+  String from(AstNode node, CorrectionUtils utils);
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index ec4ab2e..7489132 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -515,6 +515,9 @@
       ImportLibrary.forTopLevelVariable,
       ImportLibrary.forType,
     ],
+    CompileTimeErrorCode.INVALID_OVERRIDE: [
+      DataDriven.newInstance,
+    ],
     CompileTimeErrorCode.MIXIN_OF_NON_CLASS: [
       ImportLibrary.forType,
     ],
@@ -572,6 +575,18 @@
     CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER: [
       ChangeArgumentName.newInstance,
     ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_EXTENSION: [
+      DataDriven.newInstance,
+    ],
+    CompileTimeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD: [
+      DataDriven.newInstance,
+    ],
     HintCode.DEPRECATED_MEMBER_USE: [
       DataDriven.newInstance,
     ],
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.dart
new file mode 100644
index 0000000..8d55491
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_generic_function_syntax_test.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.
+
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PreferGenericFunctionTypeAliasesTest);
+  });
+}
+
+@reflectiveTest
+class PreferGenericFunctionTypeAliasesTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_generic_function_type_aliases;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+typedef String F(int x);
+typedef F2<P, R>(P x);
+''');
+    await assertHasFix('''
+typedef F = String Function(int x);
+typedef F2<P, R> = Function(P x);
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
new file mode 100644
index 0000000..d587043
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/convert_to_if_null_test.dart
@@ -0,0 +1,35 @@
+// 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.
+
+import 'package:analysis_server/src/services/linter/lint_names.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'bulk_fix_processor.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConvertToIfNullTest);
+  });
+}
+
+@reflectiveTest
+class ConvertToIfNullTest extends BulkFixProcessorTest {
+  @override
+  String get lintCode => LintNames.prefer_if_null_operators;
+
+  Future<void> test_singleFile() async {
+    await resolveTestUnit('''
+void f(String s) {
+  print(s == null ? 'default' : s);
+  print(s != null ? s : 'default');
+}
+''');
+    await assertHasFix('''
+void f(String s) {
+  print(s ?? 'default');
+  print(s ?? 'default');
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
index 456f64d..3524501 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/bulk/test_all.dart
@@ -9,7 +9,10 @@
 import 'convert_documentation_into_line_test.dart'
     as convert_documentation_into_line;
 import 'convert_to_contains_test.dart' as convert_to_contains;
+import 'convert_to_generic_function_syntax_test.dart'
+    as convert_to_generic_function_syntax;
 import 'convert_to_if_element_test.dart' as convert_to_if_element;
+import 'convert_to_if_null_test.dart' as convert_to_if_null;
 import 'convert_to_single_quoted_strings_test.dart'
     as convert_to_single_quoted_strings;
 import 'convert_to_spread_test.dart' as convert_to_spread;
@@ -46,7 +49,9 @@
     add_override.main();
     convert_documentation_into_line.main();
     convert_to_contains.main();
+    convert_to_generic_function_syntax.main();
     convert_to_if_element.main();
+    convert_to_if_null.main();
     convert_to_single_quoted_strings.main();
     convert_to_spread.main();
     create_method.main();
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart
new file mode 100644
index 0000000..9b13ab0
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/add_type_parameter_change_test.dart
@@ -0,0 +1,280 @@
+// 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.
+
+import 'package:analysis_server/src/services/correction/fix/data_driven/add_type_parameter_change.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
+import 'package:analysis_server/src/services/correction/fix/data_driven/value_extractor.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'data_driven_test_support.dart';
+
+void main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AddTypeParameterChange_DeprecatedMemberUseTest);
+    defineReflectiveTests(AddTypeParameterChange_InvalidOverrideTest);
+    defineReflectiveTests(
+        AddTypeParameterChange_WrongNumberOfTypeArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class AddTypeParameterChange_DeprecatedMemberUseTest
+    extends _AddTypeParameterChange {
+  Future<void> test_method_first() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m<T>() {}
+}
+''');
+    setPackageData(_add(0));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int>();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m<String, int>();
+}
+''');
+  }
+
+  Future<void> test_method_last() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m<S, T>() {}
+}
+''');
+    setPackageData(_add(2));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int, double>();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int, double, String>();
+}
+''');
+  }
+
+  Future<void> test_method_middle() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m<S, U>() {}
+}
+''');
+    setPackageData(_add(1));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int, double>();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int, String, double>();
+}
+''');
+  }
+
+  Future<void> test_method_only() async {
+    setPackageContent('''
+class C {
+  @deprecated
+  void m() {}
+}
+''');
+    setPackageData(_add(0));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m<String>();
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AddTypeParameterChange_InvalidOverrideTest
+    extends _AddTypeParameterChange {
+  Future<void> test_method_bound() async {
+    setPackageContent('''
+class C {
+  void m<T extends num>() {}
+}
+''');
+    setPackageData(_add(0, extendedType: 'num'));
+    await resolveTestUnit('''
+import '$importUri';
+
+class D extends C {
+  @override
+  void m() {}
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+  @override
+  void m<T extends num>() {}
+}
+''');
+  }
+
+  Future<void> test_method_noBound() async {
+    setPackageContent('''
+class C {
+  void m<T>() {}
+}
+''');
+    setPackageData(_add(0));
+    await resolveTestUnit('''
+import '$importUri';
+
+class D extends C {
+  @override
+  void m() {}
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+class D extends C {
+  @override
+  void m<T>() {}
+}
+''');
+  }
+}
+
+@reflectiveTest
+class AddTypeParameterChange_WrongNumberOfTypeArgumentsTest
+    extends _AddTypeParameterChange {
+  Future<void> test_class() async {
+    setPackageContent('''
+class C<S, T> {}
+''');
+    setPackageData(_add(0, components: ['C']));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C<int> c) {}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C<String, int> c) {}
+''');
+  }
+
+  Future<void> test_constructor() async {
+    setPackageContent('''
+class C<S, T> {
+  void C() {}
+}
+''');
+    setPackageData(_add(0, components: ['C', 'C']));
+    await resolveTestUnit('''
+import '$importUri';
+
+C f() {
+  return C<int>();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+C f() {
+  return C<String, int>();
+}
+''');
+  }
+
+  Future<void> test_extension() async {
+    setPackageContent('''
+class C {}
+extension E<S, T> on C {
+  void m() {}
+}
+''');
+    setPackageData(_add(0, components: ['E']));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  E<int>(c).m();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  E<String, int>(c).m();
+}
+''');
+  }
+
+  Future<void> test_method() async {
+    setPackageContent('''
+class C {
+  void m<S, T>() {}
+}
+''');
+    setPackageData(_add(0));
+    await resolveTestUnit('''
+import '$importUri';
+
+void f(C c) {
+  c.m<int>();
+}
+''');
+    await assertHasFix('''
+import '$importUri';
+
+void f(C c) {
+  c.m<String, int>();
+}
+''');
+  }
+}
+
+abstract class _AddTypeParameterChange extends DataDrivenFixProcessorTest {
+  Transform _add(int index, {List<String> components, String extendedType}) =>
+      Transform(
+          title: 'title',
+          element: ElementDescriptor(
+              libraryUris: [importUri], components: components ?? ['C', 'm']),
+          changes: [
+            AddTypeParameterChange(
+                extendedType: extendedType,
+                index: index,
+                name: 'T',
+                value: LiteralExtractor('String')),
+          ]);
+}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart
deleted file mode 100644
index 7b5db56..0000000
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change_test.dart
+++ /dev/null
@@ -1,362 +0,0 @@
-// 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.
-
-import 'package:analysis_server/src/services/correction/fix.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/convert_argument_to_type_argument_change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/parameter_reference.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/rename_change.dart';
-import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'data_driven_test_support.dart';
-
-void main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(
-        ConvertArgumentToTypeArgumentChange_DeprecatedMemberUseTest);
-  });
-}
-
-@reflectiveTest
-class ConvertArgumentToTypeArgumentChange_DeprecatedMemberUseTest
-    extends DataDrivenFixProcessorTest {
-  @override
-  FixKind get kind => DartFixKind.DATA_DRIVEN;
-
-  Future<void> test_method_named_first_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1({Type t, int x}) {}
-  int m2<T>({int x}) {}
-}
-''');
-    setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(t: int, x: 0);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(x: 0);
-}
-''');
-  }
-
-  Future<void> test_method_named_last_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1({int x, int y, Type t}) {}
-  int m2<T>({int x, int y}) {}
-}
-''');
-    setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(x: 0, y: 1, t: int);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(x: 0, y: 1);
-}
-''');
-  }
-
-  Future<void> test_method_named_middle_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1({int x, Type t, int y}) {}
-  int m2<T>({int x, int y}) {}
-}
-''');
-    setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(x: 0, t: int, y: 1);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(x: 0, y: 1);
-}
-''');
-  }
-
-  Future<void> test_method_named_mixed_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1(int x, {Type t, int y}) {}
-  int m2<T>(int x, {int y}) {}
-}
-''');
-    setPackageData(_convertNamed(['C', 'm1'], 'm2', 't', 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(0, t: int, y: 1);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(0, y: 1);
-}
-''');
-  }
-
-  Future<void> test_method_positional_first_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1(Type t, int x) {}
-  int m2<T>(int x) {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(int, 0);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(0);
-}
-''');
-  }
-
-  Future<void> test_method_positional_last_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1(int x, int y, Type t) {}
-  int m2<T>(int x, int y) {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 2, 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(0, 1, int);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(0, 1);
-}
-''');
-  }
-
-  Future<void> test_method_positional_middle_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1(int x, Type t, int y) {}
-  int m2<T>(int x, int y) {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 1, 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(0, int, 1);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>(0, 1);
-}
-''');
-  }
-
-  Future<void> test_method_positional_only_first() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1<T>(Type t) {}
-  int m2<S, T>() {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1<int>(String);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<String, int>();
-}
-''');
-  }
-
-  Future<void> test_method_positional_only_last() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1<S, T>(Type t) {}
-  int m2<S, T, U>() {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 2));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1<int, double>(String);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int, double, String>();
-}
-''');
-  }
-
-  Future<void> test_method_positional_only_middle() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1<S, U>(Type t) {}
-  int m2<S, T, U>() {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 1));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1<int, double>(String);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int, String, double>();
-}
-''');
-  }
-
-  Future<void> test_method_positional_only_only() async {
-    addMetaPackage();
-    setPackageContent('''
-import 'package:meta/meta.dart';
-
-class C {
-  @deprecated
-  int m1(Type t) {}
-  int m2<T>() {}
-}
-''');
-    setPackageData(_convertPositional(['C', 'm1'], 'm2', 0, 0));
-    await resolveTestUnit('''
-import '$importUri';
-
-void f(C c) {
-  c.m1(int);
-}
-''');
-    await assertHasFix('''
-import '$importUri';
-
-void f(C c) {
-  c.m2<int>();
-}
-''');
-  }
-
-  Transform _convertNamed(List<String> components, String newName,
-          String parameterName, int typeArgumentIndex) =>
-      Transform(
-          title: 'title',
-          element: ElementDescriptor(
-              libraryUris: [importUri], components: components),
-          changes: [
-            RenameChange(newName: newName),
-            ConvertArgumentToTypeArgumentChange(
-                parameterReference: NamedParameterReference(parameterName),
-                typeArgumentIndex: typeArgumentIndex),
-          ]);
-
-  Transform _convertPositional(List<String> components, String newName,
-          int argumentIndex, int typeArgumentIndex) =>
-      Transform(
-          title: 'title',
-          element: ElementDescriptor(
-              libraryUris: [importUri], components: components),
-          changes: [
-            RenameChange(newName: newName),
-            ConvertArgumentToTypeArgumentChange(
-                parameterReference: PositionalParameterReference(argumentIndex),
-                typeArgumentIndex: typeArgumentIndex),
-          ]);
-}
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
index 5198cf1..6aaca00 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/data_driven_test_support.dart
@@ -3,8 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/services/correction/dart/data_driven.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform_set.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 
 import '../fix_processor.dart';
 
@@ -14,6 +16,9 @@
   /// Return the URI used to import the library created by [setPackageContent].
   String get importUri => 'package:p/lib.dart';
 
+  @override
+  FixKind get kind => DartFixKind.DATA_DRIVEN;
+
   /// Set the content of the library that defines the element referenced by the
   /// data on which this test is based.
   void setPackageContent(String content) {
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
index 87aec0f..8d628e2 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/rename_change_test.dart
@@ -2,11 +2,9 @@
 // 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.
 
-import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/element_descriptor.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/rename_change.dart';
 import 'package:analysis_server/src/services/correction/fix/data_driven/transform.dart';
-import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'data_driven_test_support.dart';
@@ -19,9 +17,6 @@
 
 @reflectiveTest
 class RenameChange_DeprecatedMemberUseTest extends DataDrivenFixProcessorTest {
-  @override
-  FixKind get kind => DartFixKind.DATA_DRIVEN;
-
   Future<void> test_class() async {
     addMetaPackage();
     setPackageContent('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
index 522023a..dd6eaea 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart
@@ -4,13 +4,12 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import 'convert_argument_to_type_argument_change_test.dart'
-    as convert_argument_to_type_argument_change;
+import 'add_type_parameter_change_test.dart' as add_type_parameter_change;
 import 'rename_change_test.dart' as rename_change;
 
 void main() {
   defineReflectiveSuite(() {
-    convert_argument_to_type_argument_change.main();
+    add_type_parameter_change.main();
     rename_change.main();
   });
 }
diff --git a/pkg/analyzer/lib/src/context/packages.dart b/pkg/analyzer/lib/src/context/packages.dart
index 8ea6b3b..5ef1a56 100644
--- a/pkg/analyzer/lib/src/context/packages.dart
+++ b/pkg/analyzer/lib/src/context/packages.dart
@@ -116,18 +116,22 @@
 /// location).  OTOH, if the file has the `.packages` format, still look
 /// for a `.dart_tool/package_config.json` relative to the specified [file].
 Packages parsePackagesFile(ResourceProvider provider, File file) {
-  var content = file.readAsStringSync();
-  var isJson = content.trimLeft().startsWith('{');
-  if (isJson) {
-    return parsePackageConfigJsonFile(provider, file);
-  } else {
-    var relativePackageConfigFile = file.parent
-        .getChildAssumingFolder('.dart_tool')
-        .getChildAssumingFile('package_config.json');
-    if (relativePackageConfigFile.exists) {
-      return parsePackageConfigJsonFile(provider, relativePackageConfigFile);
+  try {
+    var content = file.readAsStringSync();
+    var isJson = content.trimLeft().startsWith('{');
+    if (isJson) {
+      return parsePackageConfigJsonFile(provider, file);
+    } else {
+      var relativePackageConfigFile = file.parent
+          .getChildAssumingFolder('.dart_tool')
+          .getChildAssumingFile('package_config.json');
+      if (relativePackageConfigFile.exists) {
+        return parsePackageConfigJsonFile(provider, relativePackageConfigFile);
+      }
+      return parseDotPackagesFile(provider, file);
     }
-    return parseDotPackagesFile(provider, file);
+  } catch (e) {
+    return Packages.empty;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index d536249..e4c6c31 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -37,8 +37,14 @@
   /// The name of the analysis options file.
   static const String ANALYSIS_OPTIONS_NAME = 'analysis_options.yaml';
 
+  /// The name of the `.dart_tool` directory.
+  static const String DOT_DART_TOOL_NAME = '.dart_tool';
+
   /// The name of the packages file.
-  static const String PACKAGES_FILE_NAME = '.packages';
+  static const String PACKAGE_CONFIG_JSON_NAME = 'package_config.json';
+
+  /// The name of the packages file.
+  static const String DOT_PACKAGES_NAME = '.packages';
 
   /// The resource provider used to access the file system.
   final ResourceProvider resourceProvider;
@@ -371,7 +377,16 @@
 
   /// Return the packages file in the given [folder], or `null` if the folder
   /// does not contain a packages file.
-  File _getPackagesFile(Folder folder) => _getFile(folder, PACKAGES_FILE_NAME);
+  File _getPackagesFile(Folder folder) {
+    var file = folder
+        .getChildAssumingFolder(DOT_DART_TOOL_NAME)
+        .getChildAssumingFile(PACKAGE_CONFIG_JSON_NAME);
+    if (file.exists) {
+      return file;
+    }
+
+    return _getFile(folder, DOT_PACKAGES_NAME);
+  }
 
   /// Add to the given lists of [folders] and [files] all of the resources in
   /// the given list of [paths] that exist and are not contained within one of
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index 6b27004..b126f7e 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -3423,7 +3423,7 @@
   static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_1 =
       CompileTimeErrorCodeWithUniqueName(
           'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
-          'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1',
+          'FINAL_NOT_INITIALIZED_CONSTRUCTOR_1',
           "All final variables must be initialized, but '{0}' isn't.",
           correction: "Try adding an initializer for the field.",
           hasPublishedDocs: true);
@@ -3436,7 +3436,7 @@
   static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_2 =
       CompileTimeErrorCodeWithUniqueName(
           'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
-          'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2',
+          'FINAL_NOT_INITIALIZED_CONSTRUCTOR_2',
           "All final variables must be initialized, but '{0}' and '{1}' "
               "aren't.",
           correction: "Try adding initializers for the fields.",
@@ -3451,7 +3451,7 @@
   static const CompileTimeErrorCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS =
       CompileTimeErrorCodeWithUniqueName(
           'FINAL_NOT_INITIALIZED_CONSTRUCTOR',
-          'CompileTimeErrorCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
+          'FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
           "All final variables must be initialized, but '{0}', '{1}', and {2} "
               "others aren't.",
           correction: "Try adding initializers for the fields.",
@@ -5877,7 +5877,7 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS =
       CompileTimeErrorCodeWithUniqueName(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-          ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
           "Missing concrete implementations of '{0}', '{1}', '{2}', '{3}', and "
               "{4} more.",
           correction: "Try implementing the missing methods, or make the class "
@@ -5895,7 +5895,7 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR =
       CompileTimeErrorCodeWithUniqueName(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-          ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
           "Missing concrete implementations of '{0}', '{1}', '{2}', and '{3}'.",
           correction: "Try implementing the missing methods, or make the class "
               "abstract.",
@@ -5968,7 +5968,7 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE =
       CompileTimeErrorCodeWithUniqueName(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-          ' CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
           "Missing concrete implementation of '{0}'.",
           correction: "Try implementing the missing method, or make the class "
               "abstract.",
@@ -5984,7 +5984,7 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE =
       CompileTimeErrorCodeWithUniqueName(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-          'CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
           "Missing concrete implementations of '{0}', '{1}', and '{2}'.",
           correction: "Try implementing the missing methods, or make the class "
               "abstract.",
@@ -5999,7 +5999,7 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO =
       CompileTimeErrorCodeWithUniqueName(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER',
-          'CompileTimeErrorCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
+          'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
           "Missing concrete implementations of '{0}' and '{1}'.",
           correction: "Try implementing the missing methods, or make the class "
               "abstract.",
@@ -8101,7 +8101,7 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR =
       CompileTimeErrorCodeWithUniqueName(
           'RETURN_OF_INVALID_TYPE',
-          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
+          'RETURN_OF_INVALID_TYPE_FROM_CONSTRUCTOR',
           "A value of type '{0}' can't be returned from constructor '{2}' "
               "because it has a return type of '{1}'.",
           hasPublishedDocs: true);
@@ -8143,7 +8143,7 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_FUNCTION =
       CompileTimeErrorCodeWithUniqueName(
           'RETURN_OF_INVALID_TYPE',
-          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
+          'RETURN_OF_INVALID_TYPE_FROM_FUNCTION',
           "A value of type '{0}' can't be returned from function '{2}' because "
               "it has a return type of '{1}'.",
           hasPublishedDocs: true);
@@ -8157,7 +8157,7 @@
   static const CompileTimeErrorCode RETURN_OF_INVALID_TYPE_FROM_METHOD =
       CompileTimeErrorCodeWithUniqueName(
           'RETURN_OF_INVALID_TYPE',
-          'CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD',
+          'RETURN_OF_INVALID_TYPE_FROM_METHOD',
           "A value of type '{0}' can't be returned from method '{2}' because "
               "it has a return type of '{1}'.",
           hasPublishedDocs: true);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 056efeb..e891a3e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -3604,8 +3604,14 @@
     }
 
     var parent = node.parent;
-    if (parent is FieldDeclaration && parent.externalKeyword != null) {
-      return;
+    if (parent is FieldDeclaration) {
+      if (parent.externalKeyword != null) {
+        return;
+      }
+    } else if (parent is TopLevelVariableDeclaration) {
+      if (parent.externalKeyword != null) {
+        return;
+      }
     }
 
     if (node.type == null) {
diff --git a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
index 13aee9b..24e1ae5 100644
--- a/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/resource_provider_mixin.dart
@@ -66,7 +66,7 @@
   }
 
   File newPackagesFile(String directoryPath) {
-    String path = join(directoryPath, ContextLocatorImpl.PACKAGES_FILE_NAME);
+    String path = join(directoryPath, ContextLocatorImpl.DOT_PACKAGES_NAME);
     return newFile(path);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
index 1d80cb1..bed8770 100644
--- a/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/context_locator_test.dart
@@ -352,6 +352,42 @@
     expect(outerRoot.packagesFile, overridePackagesFile);
   }
 
+  void test_locateRoots_nested_packageConfigJson() {
+    var outerRootFolder = newFolder('/test/outer');
+    var outerOptionsFile = newOptionsFile('/test/outer');
+    var outerPackagesFile = _newPackageConfigFile('/test/outer');
+    var innerRootFolder = newFolder('/test/outer/examples/inner');
+    var innerPackagesFile = _newPackageConfigFile('/test/outer/examples/inner');
+
+    var roots = contextLocator.locateRoots(
+      includedPaths: [outerRootFolder.path],
+    );
+    expect(roots, hasLength(2));
+
+    var outerRoot = findRoot(roots, outerRootFolder);
+    expect(outerRoot.includedPaths, unorderedEquals([outerRootFolder.path]));
+    expect(
+      outerRoot.excludedPaths,
+      unorderedEquals([
+        outerPackagesFile.parent.path,
+        innerRootFolder.path,
+      ]),
+    );
+    expect(outerRoot.optionsFile, outerOptionsFile);
+    expect(outerRoot.packagesFile, outerPackagesFile);
+
+    var innerRoot = findRoot(roots, innerRootFolder);
+    expect(innerRoot.includedPaths, unorderedEquals([innerRootFolder.path]));
+    expect(
+      innerRoot.excludedPaths,
+      unorderedEquals([
+        innerPackagesFile.parent.path,
+      ]),
+    );
+    expect(innerRoot.optionsFile, outerOptionsFile);
+    expect(innerRoot.packagesFile, innerPackagesFile);
+  }
+
   void test_locateRoots_nested_packages() {
     Folder outerRootFolder = newFolder('/test/outer');
     File outerOptionsFile = newOptionsFile('/test/outer');
@@ -529,6 +565,27 @@
     expect(package1Root.packagesFile, packagesFile);
   }
 
+  void test_locateRoots_single_dir_prefer_packageConfigJson() {
+    var rootFolder = newFolder('/test');
+    var optionsFile = newOptionsFile('/test');
+    newPackagesFile('/test'); // the file is not used
+    var packageConfigJsonFile = _newPackageConfigFile('/test');
+
+    var roots = contextLocator.locateRoots(includedPaths: [rootFolder.path]);
+    expect(roots, hasLength(1));
+
+    var contentRoot = findRoot(roots, rootFolder);
+    expect(contentRoot.includedPaths, unorderedEquals([rootFolder.path]));
+    expect(
+      contentRoot.excludedPaths,
+      unorderedEquals(
+        [packageConfigJsonFile.parent.path],
+      ),
+    );
+    expect(contentRoot.optionsFile, optionsFile);
+    expect(contentRoot.packagesFile, packageConfigJsonFile);
+  }
+
   void test_locateRoots_single_file_inheritedOptions_directPackages() {
     File optionsFile = newOptionsFile('/test');
     File packagesFile = newPackagesFile('/test/root');
@@ -544,4 +601,13 @@
     expect(package1Root.optionsFile, optionsFile);
     expect(package1Root.packagesFile, packagesFile);
   }
+
+  File _newPackageConfigFile(String directoryPath) {
+    String path = join(
+      directoryPath,
+      ContextLocatorImpl.DOT_DART_TOOL_NAME,
+      ContextLocatorImpl.PACKAGE_CONFIG_JSON_NAME,
+    );
+    return newFile(path);
+  }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 6022962..fceef52 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -184,8 +184,6 @@
     }
   }
 
-  /// TODO(scheglov) Replace this with a method that changes a file in
-  /// [AnalysisContextCollectionImpl].
   AnalysisDriver driverFor(String path) {
     var context = contextFor(path) as DriverBasedAnalysisContext;
     return context.driver;
@@ -241,6 +239,79 @@
   }
 }
 
+class PackageConfigFileBuilder {
+  final List<_PackageDescription> _packages = [];
+
+  void add({
+    @required String name,
+    @required String rootPath,
+    String packageUri = 'lib/',
+    String languageVersion,
+  }) {
+    if (_packages.any((e) => e.name == name)) {
+      throw StateError('Already added: $name');
+    }
+    _packages.add(
+      _PackageDescription(
+        name: name,
+        rootPath: rootPath,
+        packageUri: packageUri,
+        languageVersion: languageVersion,
+      ),
+    );
+  }
+
+  String toContent(String Function(String) toUriStr) {
+    var buffer = StringBuffer();
+
+    buffer.writeln('{');
+
+    var prefix = ' ' * 2;
+    buffer.writeln('$prefix"configVersion": 2,');
+    buffer.writeln('$prefix"packages": [');
+
+    for (var i = 0; i < _packages.length; i++) {
+      var package = _packages[i];
+
+      var prefix = ' ' * 4;
+      buffer.writeln('$prefix{');
+
+      prefix = ' ' * 6;
+      buffer.writeln('$prefix"name": "${package.name}",');
+
+      var rootUri = toUriStr(package.rootPath);
+      buffer.write('$prefix"rootUri": "$rootUri"');
+
+      if (package.packageUri != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"packageUri": "${package.packageUri}"');
+      }
+
+      if (package.languageVersion != null) {
+        buffer.writeln(',');
+        buffer.write('$prefix"languageVersion": "${package.languageVersion}"');
+      }
+
+      buffer.writeln();
+
+      prefix = ' ' * 4;
+      buffer.write(prefix);
+      buffer.writeln(i < _packages.length - 1 ? '},' : '}');
+    }
+
+    buffer.writeln('  ]');
+    buffer.writeln('}');
+
+    return buffer.toString();
+  }
+
+  PackageConfigFileBuilder _copy() {
+    var copy = PackageConfigFileBuilder();
+    copy._packages.addAll(_packages);
+    return copy;
+  }
+}
+
 class PubPackageResolutionTest extends ContextResolutionTest {
   AnalysisOptionsImpl get analysisOptions {
     var path = convertPath(testPackageRootPath);
@@ -262,7 +333,13 @@
   @override
   void setUp() {
     super.setUp();
-    writeTestPackageConfig({});
+    writeTestPackageConfig(
+      PackageConfigFileBuilder(),
+    );
+  }
+
+  void writePackageConfig(String path, PackageConfigFileBuilder config) {
+    newFile(path, content: config.toContent(toUriStr));
   }
 
   void writeTestPackageAnalysisOptionsFile(AnalysisOptionsFileConfig config) {
@@ -272,39 +349,36 @@
     );
   }
 
-  void writeTestPackageConfig(Map<String, String> nameToRootPath) {
-    nameToRootPath = {'test': testPackageRootPath, ...nameToRootPath};
-
-    var packagesFileBuffer = StringBuffer();
-    for (var entry in nameToRootPath.entries) {
-      var name = entry.key;
-      var rootPath = entry.value;
-      packagesFileBuffer.writeln(name + ':' + toUriStr('$rootPath/lib'));
-    }
-    // TODO(scheglov) Use package_config.json
-    newFile(
-      '$testPackageRootPath/.packages',
-      content: '$packagesFileBuffer',
-    );
-  }
-
-  void writeTestPackageConfigWith(
-    Map<String, String> nameToRootPath, {
+  void writeTestPackageConfig(
+    PackageConfigFileBuilder config, {
+    bool js = false,
     bool meta = false,
   }) {
-    var metaPath = '/packages/meta';
-    MockPackages.addMetaPackageFiles(
-      getFolder(metaPath),
-    );
+    config = config._copy();
+    config.add(name: 'test', rootPath: testPackageRootPath);
 
-    writeTestPackageConfig({
-      if (meta) 'meta': metaPath,
-      ...nameToRootPath,
-    });
+    if (js) {
+      var jsPath = '/packages/js';
+      MockPackages.addJsPackageFiles(
+        getFolder(jsPath),
+      );
+      config.add(name: 'js', rootPath: jsPath);
+    }
+
+    if (meta) {
+      var metaPath = '/packages/meta';
+      MockPackages.addMetaPackageFiles(
+        getFolder(metaPath),
+      );
+      config.add(name: 'meta', rootPath: metaPath);
+    }
+
+    var path = '$testPackageRootPath/.dart_tool/package_config.json';
+    writePackageConfig(path, config);
   }
 
   void writeTestPackageConfigWithMeta() {
-    writeTestPackageConfigWith({}, meta: true);
+    writeTestPackageConfig(PackageConfigFileBuilder(), meta: true);
   }
 
   void writeTestPackagePubspecYamlFile(PubspecYamlFileConfig config) {
@@ -348,3 +422,17 @@
     );
   }
 }
+
+class _PackageDescription {
+  final String name;
+  final String rootPath;
+  final String packageUri;
+  final String languageVersion;
+
+  _PackageDescription({
+    @required this.name,
+    @required this.rootPath,
+    @required this.packageUri,
+    @required this.languageVersion,
+  });
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 0e37307..4833c25 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -33,9 +33,10 @@
   void setUp() {
     super.setUp();
 
-    writeTestPackageConfig({
-      'aaa': '$workspaceRootPath/aaa',
-    });
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
   }
 
   test_export() async {
@@ -302,9 +303,10 @@
 class DeprecatedMemberUse_PackageBuildWorkspaceTest
     extends _PackageBuildWorkspaceBase {
   test_generated() async {
-    writeTestPackageConfig({
-      'aaa': '$workspaceRootPath/aaa',
-    });
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
 
     newFile('$testPackageRootPath/pubspec.yaml', content: 'name: test');
     _newTestPackageGeneratedFile(
@@ -326,9 +328,10 @@
   }
 
   test_lib() async {
-    writeTestPackageConfig({
-      'aaa': '$workspaceRootPath/aaa',
-    });
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'aaa', rootPath: '$workspaceRootPath/aaa'),
+    );
 
     newFile('$workspaceRootPath/aaa/lib/a.dart', content: r'''
 @deprecated
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
index 561b4ca..96eba3d 100644
--- a/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_visible_for_template_member_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/test_support.dart';
@@ -22,11 +21,6 @@
   void setUp() {
     super.setUp();
 
-    var metaPath = '/packages/meta';
-    MockPackages.addMetaPackageFiles(
-      getFolder(metaPath),
-    );
-
     var angularMetaPath = '/packages/angular_meta';
     newFile('$angularMetaPath/lib/angular_meta.dart', content: r'''
 library angular.meta;
@@ -38,10 +32,11 @@
 }
 ''');
 
-    writeTestPackageConfig({
-      'meta': metaPath,
-      'angular_meta': angularMetaPath,
-    });
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'angular_meta', rootPath: angularMetaPath),
+      meta: true,
+    );
   }
 
   test_export() async {
diff --git a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
index 1ad8808..82c93cd 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/src/dart/error/hint_codes.dart';
 import 'package:analyzer/src/dart/error/syntactic_errors.dart';
-import 'package:analyzer/src/test_utilities/mock_packages.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/context_collection_resolution.dart';
@@ -21,11 +20,7 @@
   void setUp() {
     super.setUp();
 
-    var path = '/packages/js';
-    MockPackages.addJsPackageFiles(
-      getFolder(path),
-    );
-    writeTestPackageConfig({'js': path});
+    writeTestPackageConfig(PackageConfigFileBuilder(), js: true);
   }
 
   test_class() async {
diff --git a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
index f140857..c12044a 100644
--- a/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/mixin_on_sealed_class_test.dart
@@ -22,9 +22,11 @@
   }
 
   test_mixinOnSealedClass() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
index bb1f2d1..9a2b35b 100644
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
@@ -24,6 +24,12 @@
 ''');
   }
 
+  test_external_variable_non_nullable() async {
+    await assertNoErrorsInCode('''
+external int x;
+''');
+  }
+
   test_staticField_futureOr_questionArgument_none() async {
     await assertNoErrorsInCode('''
 import 'dart:async';
diff --git a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
index 2f784fb..3b2acfa 100644
--- a/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/subtype_of_sealed_class_test.dart
@@ -22,9 +22,11 @@
   }
 
   test_extendingSealedClass() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     await newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -40,9 +42,11 @@
   }
 
   test_implementingSealedClass() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -58,9 +62,11 @@
   }
 
   test_mixinApplicationOfSealedClass() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -77,9 +83,11 @@
   }
 
   test_mixinApplicationOfSealedMixin() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -96,9 +104,11 @@
   }
 
   test_mixingInWithSealedMixin() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
@@ -114,9 +124,11 @@
   }
 
   test_mixinImplementsSealedClass() async {
-    writeTestPackageConfigWith({
-      'foo': '$workspaceRootPath/foo',
-    }, meta: true);
+    writeTestPackageConfig(
+      PackageConfigFileBuilder()
+        ..add(name: 'foo', rootPath: '$workspaceRootPath/foo'),
+      meta: true,
+    );
 
     newFile('$workspaceRootPath/foo/lib/foo.dart', content: r'''
 import 'package:meta/meta.dart';
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
index 06400e6..4dfb712 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -176,4 +176,20 @@
 
 @reflectiveTest
 class UndefinedIdentifierWithNullSafetyTest extends UndefinedIdentifierTest
-    with WithNullSafetyMixin {}
+    with WithNullSafetyMixin {
+  test_get_from_external_variable_valid() async {
+    await assertNoErrorsInCode('''
+external int x;
+int f() => x;
+''');
+  }
+
+  test_set_external_variable_valid() async {
+    await assertNoErrorsInCode('''
+external int x;
+void f(int value) {
+  x = value;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
index 78e3e14..462c895 100644
--- a/pkg/analyzer/test/verify_diagnostics_test.dart
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -416,14 +416,14 @@
   }
 
   void _createAuxiliaryFiles(Map<String, String> auxiliaryFiles) {
-    Map<String, String> packageNameToRootPath = {};
+    var packageConfigBuilder = PackageConfigFileBuilder();
     for (String uriStr in auxiliaryFiles.keys) {
       if (uriStr.startsWith('package:')) {
         Uri uri = Uri.parse(uriStr);
 
         String packageName = uri.pathSegments[0];
         String packageRootPath = '/packages/$packageName';
-        packageNameToRootPath[packageName] = convertPath(packageRootPath);
+        packageConfigBuilder.add(name: packageName, rootPath: packageRootPath);
 
         String pathInLib = uri.pathSegments.skip(1).join('/');
         newFile(
@@ -437,6 +437,6 @@
         );
       }
     }
-    writeTestPackageConfigWith(packageNameToRootPath, meta: true);
+    writeTestPackageConfig(packageConfigBuilder, meta: true);
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index 6376960..e46e6ec 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1448,6 +1448,28 @@
 /// A minimal implementation of dart:collection that is sufficient to create an
 /// instance of [CoreTypes] and compile program.
 const String defaultDartCollectionSource = """
+abstract class LinkedHashMap<K, V> implements Map<K, V> {
+  factory LinkedHashMap(
+      {bool Function(K, K)? equals,
+      int Function(K)? hashCode,
+      bool Function(dynamic)? isValidKey}) => null;
+}
+
+class _InternalLinkedHashMap<K, V> {
+  _InternalLinkedHashMap();
+}
+
+abstract class LinkedHashSet<E> implements Set<E> {
+  factory LinkedHashSet(
+      {bool Function(E, E)? equals,
+      int Function(E)? hashCode,
+      bool Function(dynamic)? isValidKey}) => null;
+}
+
+class _CompactLinkedHashSet<E> {
+  _CompactLinkedHashSet();
+}
+
 class _UnmodifiableSet {
   final Map _map;
   const _UnmodifiableSet(this._map);
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
index 9cdff84..a4cb425 100644
--- a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -35,7 +35,7 @@
       #t1.{core::List::add}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
-    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     #t2.{core::Set::add}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       #t2.{core::Set::add}(2);
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 d9d87e4..4681ce9 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
@@ -458,7 +458,7 @@
       #t1.{core::List::add}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t2.{core::Set::add}(42);
     #t2.{core::Set::add}(null);
@@ -475,7 +475,7 @@
       #t4.{core::List::add}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t5.{core::Set::add}(dynVar);
     #t5.{core::Set::add}(null);
@@ -492,7 +492,7 @@
       #t7.{core::List::add}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t8.{core::Set::add}(<core::int*>[42]);
     #t8.{core::Set::add}(null);
@@ -514,7 +514,7 @@
     }
   } =>#t10;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t12 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -546,7 +546,7 @@
     }
   } =>#t16;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t18 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -578,7 +578,7 @@
     }
   } =>#t22;
   core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t24 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -611,7 +611,7 @@
       }
   } =>#t28;
   core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -646,7 +646,7 @@
       }
   } =>#t34;
   core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t36 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -681,7 +681,7 @@
       }
   } =>#t40;
   core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t42 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -715,7 +715,7 @@
     }
   } =>#t46;
   core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t48 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -731,7 +731,7 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
         #t50.{core::List::add}(#t53);
@@ -739,9 +739,9 @@
     }
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
         #t54.{core::Set::add}(#t57);
@@ -761,7 +761,7 @@
       }
   } =>#t58;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -795,7 +795,7 @@
     }
   } =>#t64;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -819,7 +819,7 @@
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t70 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
         #t70.{core::List::add}(#t72);
@@ -827,9 +827,9 @@
     }
   } =>#t70;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
         #t73.{core::Set::add}(#t75);
@@ -849,7 +849,7 @@
       }
   } =>#t76;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -883,7 +883,7 @@
     }
   } =>#t82;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -916,7 +916,7 @@
       }
   } =>#t88;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -945,7 +945,7 @@
       #t94.{core::List::add}(<core::int*>[]);
   } =>#t94;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t95.{core::Set::add}(<core::int*>[]);
     #t95.{core::Set::add}(null);
@@ -957,7 +957,7 @@
         #t96.{core::List::add}(<core::int*>[]);
   } =>#t96;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t97.{core::Set::add}(<core::int*>[]);
@@ -971,7 +971,7 @@
       #t98.{core::List::add}(3.14);
   } =>#t98;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t99.{core::Set::add}(42);
     else
@@ -1004,7 +1004,7 @@
     }
   } =>#t101;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1057,7 +1057,7 @@
     }
   } =>#t110;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1075,7 +1075,7 @@
     #t113.{core::Set::add}(null);
   } =>#t113;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1103,7 +1103,7 @@
     }
   } =>#t118;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1134,7 +1134,7 @@
       #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
   } =>#t124;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
     #t125.{core::Set::add}(null);
@@ -1159,7 +1159,7 @@
     }
   } =>#t127;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1193,7 +1193,7 @@
       #t137.{core::List::add}(42);
   } =>#t137;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
       #t138.{core::Set::add}(42);
   } =>#t138;
@@ -1212,7 +1212,7 @@
                            ^" in "bar" as{TypeError} core::int*);
   } =>#t140;
   block {
-    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
@@ -1240,7 +1240,7 @@
     }
   } =>#t146;
   block {
-    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
@@ -1274,7 +1274,7 @@
                               ^");
   } =>#t155;
   block {
-    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1301,7 +1301,7 @@
                                       ^" in 3.14 as{TypeError} core::String*);
   } =>#t157;
   block {
-    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
@@ -1335,7 +1335,7 @@
       #t166.{core::List::add}(42);
   } =>#t166;
   block {
-    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1363,7 +1363,7 @@
                                       ^");
   } =>#t168;
   block {
-    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1406,7 +1406,7 @@
       #t170.{core::List::add}(42);
   } =>#t170;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
@@ -1431,7 +1431,7 @@
                                                               ^" in 42 as{TypeError} core::String*);
   } =>#t176;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
@@ -1471,7 +1471,7 @@
       #t188.{core::List::add}(42);
   } =>#t188;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t189.{core::Set::add}(42);
     #t189.{core::Set::add}(null);
@@ -1488,7 +1488,7 @@
       #t191.{core::List::add}(dynVar);
   } =>#t191;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t192.{core::Set::add}(dynVar);
     #t192.{core::Set::add}(null);
@@ -1505,7 +1505,7 @@
       #t194.{core::List::add}(<core::int*>[42]);
   } =>#t194;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t195.{core::Set::add}(<core::int*>[42]);
     #t195.{core::Set::add}(null);
@@ -1527,7 +1527,7 @@
     }
   } =>#t197;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1559,7 +1559,7 @@
     }
   } =>#t203;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1591,7 +1591,7 @@
     }
   } =>#t209;
   core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1624,7 +1624,7 @@
       }
   } =>#t215;
   core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -1659,7 +1659,7 @@
       }
   } =>#t221;
   core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -1694,7 +1694,7 @@
       }
   } =>#t227;
   core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -1728,7 +1728,7 @@
     }
   } =>#t233;
   core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1752,7 +1752,7 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
         #t239.{core::List::add}(#t242);
@@ -1760,9 +1760,9 @@
     }
   } =>#t239;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
         #t243.{core::Set::add}(#t246);
@@ -1782,7 +1782,7 @@
       }
   } =>#t247;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1816,7 +1816,7 @@
     }
   } =>#t253;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1840,7 +1840,7 @@
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t259 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
         #t259.{core::List::add}(#t261);
@@ -1848,9 +1848,9 @@
     }
   } =>#t259;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
         #t262.{core::Set::add}(#t264);
@@ -1870,7 +1870,7 @@
       }
   } =>#t265;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -1892,7 +1892,7 @@
     }
   } =>#t269;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1925,7 +1925,7 @@
       }
   } =>#t275;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1954,7 +1954,7 @@
       #t281.{core::List::add}(<core::int*>[]);
   } =>#t281;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t282.{core::Set::add}(<core::int*>[]);
     #t282.{core::Set::add}(null);
@@ -1972,7 +1972,7 @@
         #t284.{core::List::add}(<core::int*>[]);
   } =>#t284;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t285.{core::Set::add}(<core::int*>[]);
@@ -1994,7 +1994,7 @@
         #t287.{core::List::add}(3.14);
   } =>#t287;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t288.{core::Set::add}(42);
@@ -2030,7 +2030,7 @@
       }
   } =>#t290;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2086,7 +2086,7 @@
       }
   } =>#t299;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2137,7 +2137,7 @@
       }
   } =>#t308;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2170,7 +2170,7 @@
       #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
   } =>#t314;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
     #t315.{core::Set::add}(null);
@@ -2195,7 +2195,7 @@
     }
   } =>#t317;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2229,7 +2229,7 @@
       #t327.{core::List::add}(42);
   } =>#t327;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
       #t329.{core::Set::add}(42);
   } =>#t329;
@@ -2249,7 +2249,7 @@
     }
   } =>#t333;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2281,7 +2281,7 @@
     }
   } =>#t336;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2308,7 +2308,7 @@
       #t339.{core::List::add}(i);
   } =>#t339;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
       #t340.{core::Set::add}(i);
   } =>#t340;
@@ -2342,7 +2342,7 @@
                                             ^" in "bar" as{TypeError} core::int*);
         } =>#t342;
         block {
-          final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
@@ -2374,7 +2374,7 @@
           }
         } =>#t350;
         block {
-          final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
@@ -2412,7 +2412,7 @@
                                                ^");
         } =>#t361;
         block {
-          final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -2440,7 +2440,7 @@
                                                                      ^" in 3.14 as{TypeError} core::String*);
         } =>#t363;
         block {
-          final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+          final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -2477,7 +2477,7 @@
               #t372.{core::List::add}(42);
         } =>#t372;
         block {
-          final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
@@ -2507,7 +2507,7 @@
                                                                      ^");
         } =>#t374;
         block {
-          final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t375.{core::Set::add}(42);
@@ -2542,7 +2542,7 @@
           }
         } =>#t376;
         block {
-          final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2587,7 +2587,7 @@
           }
         } =>#t382;
         core::Set<dynamic>* set10 = block {
-          final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+          final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
           {
             core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
@@ -2629,7 +2629,7 @@
           }
         } =>#t388;
         core::Set<core::int*>* set20 = block {
-          final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
@@ -2685,7 +2685,7 @@
             }
         }
         core::List<dynamic>* list30 = block {} =>#t397;
-        final core::Set<dynamic>* #t402 = col::LinkedHashSet::•<dynamic>();
+        final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
         {
           asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
@@ -2771,7 +2771,7 @@
             }
         }
         core::List<core::int*>* list40 = block {} =>#t412;
-        final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
+        final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
         {
           asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
@@ -2837,7 +2837,7 @@
             #t430.{core::List::add}(42);
         } =>#t430;
         core::Set<core::int*>* set50 = block {
-          final core::Set<core::int*>* #t431 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; ; )
             #t431.{core::Set::add}(42);
           #t431.{core::Set::add}(null);
@@ -2856,7 +2856,7 @@
             #t433.{core::List::add}(42);
         } =>#t433;
         core::Set<core::int*>* set60 = block {
-          final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
@@ -2891,7 +2891,7 @@
       #t439.{core::List::add}(i);
   } =>#t439;
   block {
-    final core::Set<core::int*>* #t440 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
       #t440.{core::Set::add}(i);
   } =>#t440;
@@ -2908,7 +2908,7 @@
       #t442.{core::List::add}(a{self::B*}.{self::B::foo});
   } =>#t442;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t443 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(a is self::B*)
       #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
   } =>#t443;
diff --git a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
index 5cba724..ac2c29c 100644
--- a/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/if_null_in_set_literal.dart.strong.transformed.expect
@@ -6,5 +6,5 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
 }
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
index 9c0061a..df37bc0 100644
--- a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
   final field core::Set<core::int*>* s;
   constructor •(core::List<core::int*>* ell) → self::C*
     : self::C::s = block {
-      final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+      final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
       {
         core::Iterator<core::int*>* :sync-for-iterator = ell.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
index d895697..9ff4788 100644
--- a/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/null_aware_spread.dart.strong.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
-    final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
     #t4.{core::Set::add}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null)) {
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
index fdbefbc..15ed3cf 100644
--- a/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
@@ -51,7 +51,7 @@
     }
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
-    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
     #t9.{core::Set::add}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
index e42c97f..477502d 100644
--- a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -120,7 +120,7 @@
     }
   } =>#t1;
   core::Set<dynamic>* set10 = block {
-    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t3 = new col::_CompactLinkedHashSet::•<dynamic>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,7 +160,7 @@
     }
   } =>#t9;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t11 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -171,7 +171,7 @@
     #t11.{core::Set::add}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
-    final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -215,7 +215,7 @@
     }
   } =>#t20;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t22 = new col::_CompactLinkedHashSet::•<dynamic>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -251,7 +251,7 @@
     }
   } =>#t26;
   core::Set<core::int*>* set22 = block {
-    final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t28 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -262,7 +262,7 @@
     #t28.{core::Set::add}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
-    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -295,7 +295,7 @@
     }
   } =>#t35;
   core::Set<core::List<core::int*>*>* set23 = block {
-    final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -306,7 +306,7 @@
     #t37.{core::Set::add}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
-    final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -348,7 +348,7 @@
  - 'Set' is from 'dart:core'.
   int set30 = /*@ typeArgs=int* */ {...spread, 42};
                                    ^" in ( block {
-    final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t48 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -362,7 +362,7 @@
  - 'Set' is from 'dart:core'.
       {...spread};
       ^" in ( block {
-    final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -404,7 +404,7 @@
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:111:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:113:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
                                     ^") in #t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:115:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
@@ -413,7 +413,7 @@
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:117:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:119:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
                                     ^") in #t62;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:121:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
@@ -422,7 +422,7 @@
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:123:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:125:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
                                   ^") in #t64;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:127:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
@@ -434,11 +434,11 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:131:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:133:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
     #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
     ...null,
        ^");
@@ -468,7 +468,7 @@
     }
   } =>#t71;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t75 = null;
     if(!#t75.{core::Object::==}(null)) {
       core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
@@ -479,7 +479,7 @@
     }
   } =>#t74;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
     final core::Iterable<dynamic>* #t78 = null;
     if(!#t78.{core::Object::==}(null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
index 9cdff84..a4cb425 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection.dart.weak.transformed.expect
@@ -35,7 +35,7 @@
       #t1.{core::List::add}(i);
   } =>#t1;
   final core::Set<core::int*>* aSet = block {
-    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     #t2.{core::Set::add}(1);
     if(self::oracle() as{TypeError,ForDynamic} core::bool*)
       #t2.{core::Set::add}(2);
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 cc12197..55eecb6 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
@@ -458,7 +458,7 @@
       #t1.{core::List::add}(42);
   } =>#t1;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t2.{core::Set::add}(42);
     #t2.{core::Set::add}(null);
@@ -475,7 +475,7 @@
       #t4.{core::List::add}(dynVar);
   } =>#t4;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t5.{core::Set::add}(dynVar);
     #t5.{core::Set::add}(null);
@@ -492,7 +492,7 @@
       #t7.{core::List::add}(<core::int*>[42]);
   } =>#t7;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t8 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t8 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t8.{core::Set::add}(<core::int*>[42]);
     #t8.{core::Set::add}(null);
@@ -514,7 +514,7 @@
     }
   } =>#t10;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t12 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -546,7 +546,7 @@
     }
   } =>#t16;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t18 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -578,7 +578,7 @@
     }
   } =>#t22;
   core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t24 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -611,7 +611,7 @@
       }
   } =>#t28;
   core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -646,7 +646,7 @@
       }
   } =>#t34;
   core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t36 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -681,7 +681,7 @@
       }
   } =>#t40;
   core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t42 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -715,7 +715,7 @@
     }
   } =>#t46;
   core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t48 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -731,7 +731,7 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t50 = <core::List<core::int*>*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t51 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t52 = #t51.{core::Set::add}(<core::int*>[]) in #t51).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t53 = :sync-for-iterator.{core::Iterator::current};
         #t50.{core::List::add}(#t53);
@@ -739,9 +739,9 @@
     }
   } =>#t50;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t54 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t55 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t56 = #t55.{core::Set::add}(<core::int*>[]) in #t55).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t57 = :sync-for-iterator.{core::Iterator::current};
         #t54.{core::Set::add}(#t57);
@@ -761,7 +761,7 @@
       }
   } =>#t58;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t60 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -795,7 +795,7 @@
     }
   } =>#t64;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -819,7 +819,7 @@
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t70 = <core::int*>[];
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = col::LinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t71 = new col::_CompactLinkedHashSet::•<core::int*>() in #t71).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t72 = :sync-for-iterator.{core::Iterator::current};
         #t70.{core::List::add}(#t72);
@@ -827,9 +827,9 @@
     }
   } =>#t70;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t73 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>() in #t74).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t75 = :sync-for-iterator.{core::Iterator::current};
         #t73.{core::Set::add}(#t75);
@@ -849,7 +849,7 @@
       }
   } =>#t76;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t78 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -883,7 +883,7 @@
     }
   } =>#t82;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t84 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -916,7 +916,7 @@
       }
   } =>#t88;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t90 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -945,7 +945,7 @@
       #t94.{core::List::add}(<core::int*>[]);
   } =>#t94;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t95 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t95.{core::Set::add}(<core::int*>[]);
     #t95.{core::Set::add}(null);
@@ -957,7 +957,7 @@
         #t96.{core::List::add}(<core::int*>[]);
   } =>#t96;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t97 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t97.{core::Set::add}(<core::int*>[]);
@@ -971,7 +971,7 @@
       #t98.{core::List::add}(3.14);
   } =>#t98;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t99 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t99.{core::Set::add}(42);
     else
@@ -1004,7 +1004,7 @@
     }
   } =>#t101;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t104 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1057,7 +1057,7 @@
     }
   } =>#t110;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t113 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1075,7 +1075,7 @@
     #t113.{core::Set::add}(null);
   } =>#t113;
   core::Set<dynamic>* map82 = block {
-    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t116 = new col::_CompactLinkedHashSet::•<dynamic>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:73:38: Error: Unexpected type 'Map<String, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1103,7 +1103,7 @@
     }
   } =>#t118;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t120 = new col::_CompactLinkedHashSet::•<core::num*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1134,7 +1134,7 @@
       #t124.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
   } =>#t124;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t125 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t125.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
     #t125.{core::Set::add}(null);
@@ -1159,7 +1159,7 @@
     }
   } =>#t127;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t130 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1193,7 +1193,7 @@
       #t137.{core::List::add}(42);
   } =>#t137;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t138 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(dynVar as{TypeError,ForDynamic} core::bool*)
       #t138.{core::Set::add}(42);
   } =>#t138;
@@ -1212,7 +1212,7 @@
                            ^" in "bar" as{TypeError} core::int*);
   } =>#t140;
   block {
-    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t142 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:90:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) \"bar\", null};
@@ -1240,7 +1240,7 @@
     }
   } =>#t146;
   block {
-    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t149 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t150 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:93:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
@@ -1274,7 +1274,7 @@
                               ^");
   } =>#t155;
   block {
-    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t156 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:96:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1301,7 +1301,7 @@
                                       ^" in 3.14 as{TypeError} core::String*);
   } =>#t157;
   block {
-    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t160 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:99:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
   <String>{if (oracle(\"foo\")) 42 else 3.14, null};
@@ -1335,7 +1335,7 @@
       #t166.{core::List::add}(42);
   } =>#t166;
   block {
-    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t167 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:102:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1363,7 +1363,7 @@
                                       ^");
   } =>#t168;
   block {
-    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t169 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:105:31: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -1406,7 +1406,7 @@
       #t170.{core::List::add}(42);
   } =>#t170;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t172 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:115:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
   Set<int> set20 = {if (42) 42};
                         ^" in 42 as{TypeError} core::bool*)
@@ -1431,7 +1431,7 @@
                                                               ^" in 42 as{TypeError} core::String*);
   } =>#t176;
   core::Set<core::String*>* set40 = block {
-    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t179 = new col::_CompactLinkedHashSet::•<core::String*>();
     if(self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*)
       #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:118:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
   Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
@@ -1471,7 +1471,7 @@
       #t188.{core::List::add}(42);
   } =>#t188;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t189 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t189.{core::Set::add}(42);
     #t189.{core::Set::add}(null);
@@ -1488,7 +1488,7 @@
       #t191.{core::List::add}(dynVar);
   } =>#t191;
   core::Set<dynamic>* set11 = block {
-    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t192 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t192.{core::Set::add}(dynVar);
     #t192.{core::Set::add}(null);
@@ -1505,7 +1505,7 @@
       #t194.{core::List::add}(<core::int*>[42]);
   } =>#t194;
   core::Set<core::List<core::int*>*>* set12 = block {
-    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t195 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t195.{core::Set::add}(<core::int*>[42]);
     #t195.{core::Set::add}(null);
@@ -1527,7 +1527,7 @@
     }
   } =>#t197;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t199 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1559,7 +1559,7 @@
     }
   } =>#t203;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t205 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1591,7 +1591,7 @@
     }
   } =>#t209;
   core::Set<core::List<core::int*>*>* set22 = block {
-    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t211 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1624,7 +1624,7 @@
       }
   } =>#t215;
   core::Set<core::int*>* set30 = block {
-    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t217 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[42].{core::Iterable::iterator};
@@ -1659,7 +1659,7 @@
       }
   } =>#t221;
   core::Set<dynamic>* set31 = block {
-    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t223 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[dynVar].{core::Iterable::iterator};
@@ -1694,7 +1694,7 @@
       }
   } =>#t227;
   core::Set<core::List<core::int*>*>* set33 = block {
-    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t229 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[42]].{core::Iterable::iterator};
@@ -1728,7 +1728,7 @@
     }
   } =>#t233;
   core::Set<core::List<core::int*>*>* set40 = block {
-    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t235 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1752,7 +1752,7 @@
   core::List<core::List<core::int*>*>* list41 = block {
     final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t240 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t241 = #t240.{core::Set::add}(<core::int*>[]) in #t240).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t242 = :sync-for-iterator.{core::Iterator::current};
         #t239.{core::List::add}(#t242);
@@ -1760,9 +1760,9 @@
     }
   } =>#t239;
   core::Set<core::List<core::int*>*>* set41 = block {
-    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t243 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
+      core::Iterator<core::List<core::int*>*>* :sync-for-iterator = (let final core::Set<core::List<core::int*>*>* #t244 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>() in let final core::bool #t245 = #t244.{core::Set::add}(<core::int*>[]) in #t244).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::List<core::int*>* #t246 = :sync-for-iterator.{core::Iterator::current};
         #t243.{core::Set::add}(#t246);
@@ -1782,7 +1782,7 @@
       }
   } =>#t247;
   core::Set<core::List<core::int*>*>* set42 = block {
-    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t249 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1816,7 +1816,7 @@
     }
   } =>#t253;
   core::Set<core::int*>* set50 = block {
-    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t255 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1840,7 +1840,7 @@
   core::List<core::int*>* list51 = block {
     final core::List<core::int*>* #t259 = <core::int*>[];
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = col::LinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t260 = new col::_CompactLinkedHashSet::•<core::int*>() in #t260).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t261 = :sync-for-iterator.{core::Iterator::current};
         #t259.{core::List::add}(#t261);
@@ -1848,9 +1848,9 @@
     }
   } =>#t259;
   core::Set<core::int*>* set51 = block {
-    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t262 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
-      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = col::LinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
+      core::Iterator<core::int*>* :sync-for-iterator = (let final core::Set<core::int*>* #t263 = new col::_CompactLinkedHashSet::•<core::int*>() in #t263).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
         final core::int* #t264 = :sync-for-iterator.{core::Iterator::current};
         #t262.{core::Set::add}(#t264);
@@ -1870,7 +1870,7 @@
       }
   } =>#t265;
   core::Set<core::int*>* set52 = block {
-    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t267 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
@@ -1892,7 +1892,7 @@
     }
   } =>#t269;
   core::Set<core::List<core::int*>*>* set60 = block {
-    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t271 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -1925,7 +1925,7 @@
       }
   } =>#t275;
   core::Set<core::List<core::int*>*>* set61 = block {
-    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t277 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
@@ -1954,7 +1954,7 @@
       #t281.{core::List::add}(<core::int*>[]);
   } =>#t281;
   core::Set<core::List<core::int*>*>* set70 = block {
-    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t282 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t282.{core::Set::add}(<core::int*>[]);
     #t282.{core::Set::add}(null);
@@ -1972,7 +1972,7 @@
         #t284.{core::List::add}(<core::int*>[]);
   } =>#t284;
   core::Set<core::List<core::int*>*>* set71 = block {
-    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t285 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t285.{core::Set::add}(<core::int*>[]);
@@ -1994,7 +1994,7 @@
         #t287.{core::List::add}(3.14);
   } =>#t287;
   core::Set<core::num*>* set80 = block {
-    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t288 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
         #t288.{core::Set::add}(42);
@@ -2030,7 +2030,7 @@
       }
   } =>#t290;
   core::Set<core::num*>* set81 = block {
-    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t293 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2086,7 +2086,7 @@
       }
   } =>#t299;
   core::Set<dynamic>* set82 = block {
-    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t302 = new col::_CompactLinkedHashSet::•<dynamic>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2137,7 +2137,7 @@
       }
   } =>#t308;
   core::Set<core::num*>* set83 = block {
-    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    final core::Set<core::num*>* #t310 = new col::_CompactLinkedHashSet::•<core::num*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*) {
         core::Iterator<core::int*>* :sync-for-iterator = listInt.{core::Iterable::iterator};
@@ -2170,7 +2170,7 @@
       #t314.{core::List::add}(dynVar as{TypeError,ForDynamic} core::int*);
   } =>#t314;
   core::Set<core::int*>* set90 = block {
-    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t315 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
       #t315.{core::Set::add}(dynVar as{TypeError,ForDynamic} core::int*);
     #t315.{core::Set::add}(null);
@@ -2195,7 +2195,7 @@
     }
   } =>#t317;
   core::Set<core::int*>* set91 = block {
-    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t320 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2229,7 +2229,7 @@
       #t327.{core::List::add}(42);
   } =>#t327;
   core::Set<core::int*>* set100 = block {
-    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t329 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; index = index.{core::num::+}(1))
       #t329.{core::Set::add}(42);
   } =>#t329;
@@ -2249,7 +2249,7 @@
     }
   } =>#t333;
   core::Set<core::int*>* set110 = block {
-    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t334 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1, 2, 3].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2281,7 +2281,7 @@
     }
   } =>#t336;
   core::Set<core::int*>* set120 = block {
-    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t337 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = (dynVar as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2308,7 +2308,7 @@
       #t339.{core::List::add}(i);
   } =>#t339;
   core::Set<core::int*>* set130 = block {
-    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t340 = new col::_CompactLinkedHashSet::•<core::int*>();
     for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
       #t340.{core::Set::add}(i);
   } =>#t340;
@@ -2342,7 +2342,7 @@
                                             ^" in "bar" as{TypeError} core::int*);
         } =>#t342;
         block {
-          final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t344 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:213:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
@@ -2374,7 +2374,7 @@
           }
         } =>#t350;
         block {
-          final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t353 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1)) {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t354 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:216:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
@@ -2412,7 +2412,7 @@
                                                ^");
         } =>#t361;
         block {
-          final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t362 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:219:48: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
  - 'Map' is from 'dart:core'.
@@ -2440,7 +2440,7 @@
                                                                      ^" in 3.14 as{TypeError} core::String*);
         } =>#t363;
         block {
-          final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+          final core::Set<core::String*>* #t366 = new col::_CompactLinkedHashSet::•<core::String*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:222:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
@@ -2477,7 +2477,7 @@
               #t372.{core::List::add}(42);
         } =>#t372;
         block {
-          final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t373 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:225:62: Error: Unexpected type 'Map<int, int>' of a spread.  Expected 'dynamic' or an Iterable.
@@ -2507,7 +2507,7 @@
                                                                      ^");
         } =>#t374;
         block {
-          final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t375 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError,ForDynamic} core::bool*; i = i.{core::num::+}(1))
             if(self::oracle<dynamic>() as{TypeError,ForDynamic} core::bool*)
               #t375.{core::Set::add}(42);
@@ -2542,7 +2542,7 @@
           }
         } =>#t376;
         block {
-          final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t378 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[1].{core::Iterable::iterator};
             for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -2587,7 +2587,7 @@
           }
         } =>#t382;
         core::Set<dynamic>* set10 = block {
-          final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+          final core::Set<dynamic>* #t384 = new col::_CompactLinkedHashSet::•<dynamic>();
           {
             core::Iterator<dynamic>* :sync-for-iterator = (let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:237:30: Error: The type 'String' used in the 'for' loop must implement 'Iterable<dynamic>'.
  - 'Iterable' is from 'dart:core'.
@@ -2629,7 +2629,7 @@
           }
         } =>#t388;
         core::Set<core::int*>* set20 = block {
-          final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t391 = new col::_CompactLinkedHashSet::•<core::int*>();
           {
             core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:240:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set20 = {for (int i in [\"not\", \"int\"]) i, null};
@@ -2685,7 +2685,7 @@
             }
         }
         core::List<dynamic>* list30 = block {} =>#t397;
-        final core::Set<dynamic>* #t402 = col::LinkedHashSet::•<dynamic>();
+        final core::Set<dynamic>* #t402 = new col::_CompactLinkedHashSet::•<dynamic>();
         {
           asy::Stream<dynamic>* :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:243:36: Error: The type 'String' used in the 'for' loop must implement 'Stream<dynamic>'.
  - 'Stream' is from 'dart:async'.
@@ -2771,7 +2771,7 @@
             }
         }
         core::List<core::int*>* list40 = block {} =>#t412;
-        final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
+        final core::Set<core::int*>* #t418 = new col::_CompactLinkedHashSet::•<core::int*>();
         {
           asy::Stream<core::int*> :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:246:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
   var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
@@ -2837,7 +2837,7 @@
             #t430.{core::List::add}(42);
         } =>#t430;
         core::Set<core::int*>* set50 = block {
-          final core::Set<core::int*>* #t431 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t431 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; ; )
             #t431.{core::Set::add}(42);
           #t431.{core::Set::add}(null);
@@ -2856,7 +2856,7 @@
             #t433.{core::List::add}(42);
         } =>#t433;
         core::Set<core::int*>* set60 = block {
-          final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
+          final core::Set<core::int*>* #t435 = new col::_CompactLinkedHashSet::•<core::int*>();
           for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/control_flow_collection_inference.dart:252:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
   var set60 = {for (; \"not bool\";) 42, null};
                       ^" in "not bool" as{TypeError} core::bool*; )
@@ -2891,7 +2891,7 @@
       #t439.{core::List::add}(i);
   } =>#t439;
   block {
-    final core::Set<core::int*>* #t440 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t440 = new col::_CompactLinkedHashSet::•<core::int*>();
     await for (core::int* i in stream)
       #t440.{core::Set::add}(i);
   } =>#t440;
@@ -2908,7 +2908,7 @@
       #t442.{core::List::add}(a{self::B*}.{self::B::foo});
   } =>#t442;
   core::Set<core::int*>* set10 = block {
-    final core::Set<core::int*>* #t443 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t443 = new col::_CompactLinkedHashSet::•<core::int*>();
     if(a is self::B*)
       #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
   } =>#t443;
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
index 5cba724..ac2c29c 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/if_null_in_set_literal.dart.weak.transformed.expect
@@ -6,5 +6,5 @@
 static method main() → dynamic {
   core::Object* a;
   core::Object* b;
-  return let final core::Set<core::Object*>* #t1 = col::LinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
+  return let final core::Set<core::Object*>* #t1 = new col::_CompactLinkedHashSet::•<core::Object*>() in let final core::bool #t2 = #t1.{core::Set::add}(let final core::Object* #t3 = a in #t3.{core::Object::==}(null) ?{core::Object*} b : #t3) in #t1;
 }
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
index 9c0061a..df37bc0 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/issue37027.dart.weak.transformed.expect
@@ -7,7 +7,7 @@
   final field core::Set<core::int*>* s;
   constructor •(core::List<core::int*>* ell) → self::C*
     : self::C::s = block {
-      final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+      final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
       {
         core::Iterator<core::int*>* :sync-for-iterator = ell.{core::Iterable::iterator};
         for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
index d895697..9ff4788 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/null_aware_spread.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
 }
 static method nullAwareSetSpread(core::Set<core::String*>* set) → dynamic {
   set = block {
-    final core::Set<core::String*>* #t4 = col::LinkedHashSet::•<core::String*>();
+    final core::Set<core::String*>* #t4 = new col::_CompactLinkedHashSet::•<core::String*>();
     #t4.{core::Set::add}("foo");
     final core::Iterable<core::String*>* #t5 = set;
     if(!#t5.{core::Object::==}(null)) {
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
index d860998..f06f6bc 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection.dart.weak.transformed.expect
@@ -51,7 +51,7 @@
     }
   } =>#t5;
   final core::Set<core::int*>* aSet = block {
-    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t9 = new col::_CompactLinkedHashSet::•<core::int*>();
     #t9.{core::Set::add}(1);
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[2].{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
index 6e97878..7a37a6f 100644
--- a/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart.weak.transformed.expect
@@ -120,7 +120,7 @@
     }
   } =>#t1;
   core::Set<dynamic>* set10 = block {
-    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t3 = new col::_CompactLinkedHashSet::•<dynamic>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = <dynamic>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -160,7 +160,7 @@
     }
   } =>#t9;
   core::Set<core::int*>* set20 = block {
-    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t11 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -171,7 +171,7 @@
     #t11.{core::Set::add}(42);
   } =>#t11;
   core::Set<core::int*>* set20ambiguous = block {
-    final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t13 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -215,7 +215,7 @@
     }
   } =>#t20;
   core::Set<dynamic>* set21 = block {
-    final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t22 = new col::_CompactLinkedHashSet::•<dynamic>();
     {
       core::Iterator<dynamic>* :sync-for-iterator = ((spread as dynamic) as{TypeError,ForDynamic} core::Iterable<dynamic>*).{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -251,7 +251,7 @@
     }
   } =>#t26;
   core::Set<core::int*>* set22 = block {
-    final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t28 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -262,7 +262,7 @@
     #t28.{core::Set::add}(42);
   } =>#t28;
   core::Set<core::int*>* set22ambiguous = block {
-    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t30 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = <core::int*>[].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -295,7 +295,7 @@
     }
   } =>#t35;
   core::Set<core::List<core::int*>*>* set23 = block {
-    final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -306,7 +306,7 @@
     #t37.{core::Set::add}(<core::int*>[42]);
   } =>#t37;
   core::Set<core::List<core::int*>*>* set23ambiguous = block {
-    final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    final core::Set<core::List<core::int*>*>* #t39 = new col::_CompactLinkedHashSet::•<core::List<core::int*>*>();
     {
       core::Iterator<core::List<core::int*>*>* :sync-for-iterator = <core::List<core::int*>*>[<core::int*>[]].{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -348,7 +348,7 @@
  - 'Set' is from 'dart:core'.
   int set30 = /*@ typeArgs=int* */ {...spread, 42};
                                    ^" in ( block {
-    final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t48 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -362,7 +362,7 @@
  - 'Set' is from 'dart:core'.
       {...spread};
       ^" in ( block {
-    final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t51 = new col::_CompactLinkedHashSet::•<core::int*>();
     {
       core::Iterator<core::int*>* :sync-for-iterator = spread.{core::Iterable::iterator};
       for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
@@ -404,7 +404,7 @@
   core::List<dynamic>* lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:113:38: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
                                      ^"];
-  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set40 = let final core::Set<dynamic>* #t60 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:115:37: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
                                     ^") in #t60;
   core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:117:55: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
@@ -413,7 +413,7 @@
   core::List<dynamic>* lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:119:38: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
                                      ^"];
-  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
+  core::Set<dynamic>* set50 = let final core::Set<dynamic>* #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:121:37: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
                                     ^") in #t62;
   core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:123:55: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
@@ -422,7 +422,7 @@
   core::List<core::String*>* lhs60 = <core::String*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:125:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   List<String> lhs60 = <String>[...spread];
                                    ^"];
-  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
+  core::Set<core::String*>* set60 = let final core::Set<core::String*>* #t64 = new col::_CompactLinkedHashSet::•<core::String*>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:127:35: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
   Set<String> set60 = <String>{...spread};
                                   ^") in #t64;
   core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:129:39: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
@@ -434,11 +434,11 @@
   core::List<core::int*>* lhs70 = <core::int*>[invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:133:30: Error: Can't spread a value with static type 'Null'.
   List<int> lhs70 = <int>[...null];
                              ^"];
-  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
+  core::Set<core::int*>* set70 = let final core::Set<core::int*>* #t66 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:135:29: Error: Can't spread a value with static type 'Null'.
   Set<int> set70 = <int>{...null};
                             ^") in #t66;
   core::Set<dynamic>* set71ambiguous = block {
-    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t68 = new col::_CompactLinkedHashSet::•<dynamic>();
     #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general_nnbd_opt_out/spread_collection_inference.dart:139:8: Error: Expected ',' before this.
     ...null,
        ^");
@@ -468,7 +468,7 @@
     }
   } =>#t71;
   core::Set<core::int*>* set80 = block {
-    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t74 = new col::_CompactLinkedHashSet::•<core::int*>();
     final core::Iterable<core::int*>* #t75 = null;
     if(!#t75.{core::Object::==}(null)) {
       core::Iterator<core::int*>* :sync-for-iterator = #t75.{core::Iterable::iterator};
@@ -479,7 +479,7 @@
     }
   } =>#t74;
   core::Set<dynamic>* set81ambiguous = block {
-    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+    final core::Set<dynamic>* #t77 = new col::_CompactLinkedHashSet::•<dynamic>();
     final core::Iterable<dynamic>* #t78 = null;
     if(!#t78.{core::Object::==}(null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t78.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
index 29a46f9..4b9609d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.1.expect
@@ -214,7 +214,7 @@
       return result;
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toSet() → dart.core::Set<dart.core::int*> {
-      dart.core::Set<dart.core::int*> result = dart.collection::LinkedHashSet::•<dart.core::int*>();
+      dart.core::Set<dart.core::int*> result = new dart.collection::_CompactLinkedHashSet::•<dart.core::int*>();
       for (dart.core::int i = 0; i.{dart.core::num::<}(this.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
         result.{dart.core::Set::add}(this.{dart.core::List::[]}(i));
       }
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
index 29a46f9..4b9609d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/no_outline_change_22.yaml.world.2.expect
@@ -214,7 +214,7 @@
       return result;
     }
     method /*isNonNullableByDefault, from org-dartlang-sdk:///sdk/lib/collection/list.dart */ toSet() → dart.core::Set<dart.core::int*> {
-      dart.core::Set<dart.core::int*> result = dart.collection::LinkedHashSet::•<dart.core::int*>();
+      dart.core::Set<dart.core::int*> result = new dart.collection::_CompactLinkedHashSet::•<dart.core::int*>();
       for (dart.core::int i = 0; i.{dart.core::num::<}(this.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
         result.{dart.core::Set::add}(this.{dart.core::List::[]}(i));
       }
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
index 7974856..4599552 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.transformed.expect
@@ -137,13 +137,13 @@
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c1 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t5 = new col::_CompactLinkedHashSet::•<dynamic>() in #t5) as{TypeError} core::List<dynamic>*;
   self::c2 = <dynamic>[];
   self::c2 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:43:59: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'List<dynamic>'.
  - 'Set' is from 'dart:core'.
  - 'List' is from 'dart:core'.
   c2 = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ {};
-                                                          ^" in (let final core::Set<dynamic>* #t7 = col::LinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
+                                                          ^" in (let final core::Set<dynamic>* #t7 = new col::_CompactLinkedHashSet::•<dynamic>() in #t7) as{TypeError} core::List<dynamic>*;
   self::d = <dynamic, dynamic>{};
   self::d = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:45:36: Error: A value of type 'int' can't be assigned to a variable of type 'Map<dynamic, dynamic>'.
  - 'Map' is from 'dart:core'.
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 f24f351..97d6ebf 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.strong.transformed.expect
@@ -124,13 +124,13 @@
     }
   } =>#t9;
   core::Set<Never> s1 = block {
-    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
     for (final Never #t13 in n1)
       #t12.{core::Set::add}(#t13);
     #t12.{core::Set::add}(n1);
   } =>#t12;
   core::Set<Never> s2 = block {
-    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t15 = n1;
     if(!#t15.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -141,11 +141,11 @@
     }
     #t14.{core::Set::add}(n1);
   } =>#t14;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t20 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t21 = n2;
     if(!#t21.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -156,11 +156,11 @@
     }
     #t20.{core::Set::add}(n1);
   } =>#t20;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t26 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t27 = n3;
     if(!#t27.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -271,13 +271,13 @@
     }
   } =>#t48;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t51 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     for (final self::test2::N1 #t52 in n1)
       #t51.{core::Set::add}(#t52);
     #t51.{core::Set::add}(n1);
   } =>#t51;
   core::Set<self::test2::N1> s2 = block {
-    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t54 = n1;
     if(!#t54.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -288,11 +288,11 @@
     }
     #t53.{core::Set::add}(n1);
   } =>#t53;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
   core::Set<self::test2::N1> s4 = block {
-    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t59 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t60 = n2;
     if(!#t60.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -303,11 +303,11 @@
     }
     #t59.{core::Set::add}(n1);
   } =>#t59;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
   core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t65 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t66 = n3;
     if(!#t66.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
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 f24f351..97d6ebf 100644
--- a/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/issue42758.dart.weak.transformed.expect
@@ -124,13 +124,13 @@
     }
   } =>#t9;
   core::Set<Never> s1 = block {
-    final core::Set<Never> #t12 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t12 = new col::_CompactLinkedHashSet::•<Never>();
     for (final Never #t13 in n1)
       #t12.{core::Set::add}(#t13);
     #t12.{core::Set::add}(n1);
   } =>#t12;
   core::Set<Never> s2 = block {
-    final core::Set<Never> #t14 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t14 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t15 = n1;
     if(!#t15.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t15{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -141,11 +141,11 @@
     }
     #t14.{core::Set::add}(n1);
   } =>#t14;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t17 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t18 = #t17.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:14:16: Error: Can't spread a value with static type 'Never?'.
   var s3 = {...n2, n1};
                ^") in let final core::bool #t19 = #t17.{core::Set::add}(n1) in #t17;
   core::Set<Never> s4 = block {
-    final core::Set<Never> #t20 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t20 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t21 = n2;
     if(!#t21.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t21{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -156,11 +156,11 @@
     }
     #t20.{core::Set::add}(n1);
   } =>#t20;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t23 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t24 = #t23.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:16:16: Error: Can't spread a value with static type 'Null'.
   var s5 = {...n3, n1};
                ^") in let final core::bool #t25 = #t23.{core::Set::add}(n1) in #t23;
   core::Set<Never> s6 = block {
-    final core::Set<Never> #t26 = col::LinkedHashSet::•<Never>();
+    final core::Set<Never> #t26 = new col::_CompactLinkedHashSet::•<Never>();
     final core::Iterable<Never>? #t27 = n3;
     if(!#t27.{core::Object::==}(null)) {
       core::Iterator<Never> :sync-for-iterator = #t27{core::Iterable<Never>}.{core::Iterable::iterator};
@@ -271,13 +271,13 @@
     }
   } =>#t48;
   core::Set<self::test2::N1> s1 = block {
-    final core::Set<self::test2::N1> #t51 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t51 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     for (final self::test2::N1 #t52 in n1)
       #t51.{core::Set::add}(#t52);
     #t51.{core::Set::add}(n1);
   } =>#t51;
   core::Set<self::test2::N1> s2 = block {
-    final core::Set<self::test2::N1> #t53 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t53 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t54 = n1;
     if(!#t54.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t54{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -288,11 +288,11 @@
     }
     #t53.{core::Set::add}(n1);
   } =>#t53;
-  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
+  core::Set<dynamic> s3 = let final core::Set<dynamic> #t56 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t57 = #t56.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:36:16: Error: Can't spread a value with static type 'N2'.
   var s3 = {...n2, n1};
                ^") in let final core::bool #t58 = #t56.{core::Set::add}(n1) in #t56;
   core::Set<self::test2::N1> s4 = block {
-    final core::Set<self::test2::N1> #t59 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t59 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t60 = n2;
     if(!#t60.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t60{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
@@ -303,11 +303,11 @@
     }
     #t59.{core::Set::add}(n1);
   } =>#t59;
-  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
+  core::Set<dynamic> s5 = let final core::Set<dynamic> #t62 = new col::_CompactLinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/nnbd/issue42758.dart:38:16: Error: Can't spread a value with static type 'N3'.
   var s5 = {...n3, n1};
                ^") in let final core::bool #t64 = #t62.{core::Set::add}(n1) in #t62;
   core::Set<self::test2::N1> s6 = block {
-    final core::Set<self::test2::N1> #t65 = col::LinkedHashSet::•<self::test2::N1>();
+    final core::Set<self::test2::N1> #t65 = new col::_CompactLinkedHashSet::•<self::test2::N1>();
     final core::Iterable<self::test2::N1>? #t66 = n3;
     if(!#t66.{core::Object::==}(null)) {
       core::Iterator<self::test2::N1> :sync-for-iterator = #t66{core::Iterable<self::test2::N1>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
index 04ff3fd..80f3187 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.strong.transformed.expect
@@ -85,7 +85,7 @@
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
-    final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
     #t19.{core::Set::add}(1);
     #t19.{core::Set::add}(2);
     final core::Iterable<core::int>? #t20 = set;
@@ -99,7 +99,7 @@
     #t19.{core::Set::add}(3);
   } =>#t19);
   core::print( block {
-    final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
     #t22.{core::Set::add}(1);
     #t22.{core::Set::add}(2);
     final core::Iterable<core::int>? #t23 = null;
@@ -113,7 +113,7 @@
     #t22.{core::Set::add}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
-    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
     final core::Iterable<dynamic>? #t26 = set;
     if(!#t26.{core::Object::==}(null)) {
       core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -127,7 +127,7 @@
     }
   } =>#t25;
   core::Set<core::int> set3 = block {
-    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
     #t29.{core::Set::add}(1);
     #t29.{core::Set::add}(2);
     final core::Iterable<core::int>? #t30 = set;
@@ -141,7 +141,7 @@
     #t29.{core::Set::add}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
-    final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
     #t32.{core::Set::add}(1);
     #t32.{core::Set::add}(2);
     final core::Iterable<core::int>? #t33 = null;
diff --git a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
index 04ff3fd..80f3187 100644
--- a/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/spread_if_null.dart.weak.transformed.expect
@@ -85,7 +85,7 @@
   } =>#t16;
   core::Set<core::int>? set = null;
   core::print( block {
-    final core::Set<core::int> #t19 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t19 = new col::_CompactLinkedHashSet::•<core::int>();
     #t19.{core::Set::add}(1);
     #t19.{core::Set::add}(2);
     final core::Iterable<core::int>? #t20 = set;
@@ -99,7 +99,7 @@
     #t19.{core::Set::add}(3);
   } =>#t19);
   core::print( block {
-    final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t22 = new col::_CompactLinkedHashSet::•<core::int>();
     #t22.{core::Set::add}(1);
     #t22.{core::Set::add}(2);
     final core::Iterable<core::int>? #t23 = null;
@@ -113,7 +113,7 @@
     #t22.{core::Set::add}(3);
   } =>#t22);
   core::Set<core::int> set1 = block {
-    final core::Set<core::int> #t25 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t25 = new col::_CompactLinkedHashSet::•<core::int>();
     final core::Iterable<dynamic>? #t26 = set;
     if(!#t26.{core::Object::==}(null)) {
       core::Iterator<dynamic> :sync-for-iterator = #t26{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -127,7 +127,7 @@
     }
   } =>#t25;
   core::Set<core::int> set3 = block {
-    final core::Set<core::int> #t29 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t29 = new col::_CompactLinkedHashSet::•<core::int>();
     #t29.{core::Set::add}(1);
     #t29.{core::Set::add}(2);
     final core::Iterable<core::int>? #t30 = set;
@@ -141,7 +141,7 @@
     #t29.{core::Set::add}(3);
   } =>#t29;
   core::Set<core::int> set4 = block {
-    final core::Set<core::int> #t32 = col::LinkedHashSet::•<core::int>();
+    final core::Set<core::int> #t32 = new col::_CompactLinkedHashSet::•<core::int>();
     #t32.{core::Set::add}(1);
     #t32.{core::Set::add}(2);
     final core::Iterable<core::int>? #t33 = null;
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
index f215b88..3d73f1d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.strong.transformed.expect
@@ -149,7 +149,7 @@
     }
   } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Set<core::String> #t8 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<dynamic>? #t9 = l;
     if(!#t9.{core::Object::==}(null)) {
       core::Iterator<dynamic> :sync-for-iterator = #t9{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -163,7 +163,7 @@
     }
   } =>#t8;
   block {
-    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Set<core::String> #t12 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t13 = l;
     if(!#t13.{core::Object::==}(null)) {
       core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
index f215b88..3d73f1d 100644
--- a/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/strictly_non_nullable_warnings.dart.weak.transformed.expect
@@ -149,7 +149,7 @@
     }
   } =>#t5;
   core::Set<core::String> a = block {
-    final core::Set<core::String> #t8 = col::LinkedHashSet::•<core::String>();
+    final core::Set<core::String> #t8 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<dynamic>? #t9 = l;
     if(!#t9.{core::Object::==}(null)) {
       core::Iterator<dynamic> :sync-for-iterator = #t9{core::Iterable<dynamic>}.{core::Iterable::iterator};
@@ -163,7 +163,7 @@
     }
   } =>#t8;
   block {
-    final core::Set<core::String> #t12 = col::LinkedHashSet::•<core::String>();
+    final core::Set<core::String> #t12 = new col::_CompactLinkedHashSet::•<core::String>();
     final core::Iterable<core::String>? #t13 = l;
     if(!#t13.{core::Object::==}(null)) {
       core::Iterator<core::String> :sync-for-iterator = #t13{core::Iterable<core::String>}.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  field core::int? numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  field core::int? numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  field core::int? numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 2107377..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  field core::int? numLegs = null;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
deleted file mode 100644
index efe2cdd..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart
+++ /dev/null
@@ -1,14 +0,0 @@
-// 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.
-
-const String valueClass = "valueClass";
-
-@valueClass
-class Animal {
-  final int numLegs = 4;
-}
-
-class Cat extends Animal {}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index dda377d..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends core::Object implements self::Animal {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends core::Object implements self::Animal {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends core::Object implements self::Animal {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 756c16c..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-class Cat extends core::Object implements self::Animal {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
deleted file mode 100644
index 522d957..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart
+++ /dev/null
@@ -1,12 +0,0 @@
-// 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.
-
-const String valueClass = "valueClass";
-
-@valueClass
-class Animal {
-  final int numLegs = 4;
-}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
deleted file mode 100644
index 264a8f9..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  final field core::int numWhiskers = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  final field core::int numWhiskers = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  final field core::int numWhiskers = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
deleted file mode 100644
index c9c2a66..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-@#C1
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  final field core::int numWhiskers = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
deleted file mode 100644
index 7e7b833..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
deleted file mode 100644
index 7e25746..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends self::Animal {
-  synthetic constructor •() → self::Cat
-    : super self::Animal::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
deleted file mode 100644
index 2d67798..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// 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.
-
-const String valueClass = "valueClass";
-
-class Animal {
-  final int numLegs = 4;
-}
-
-@valueClass
-class Cat implements Animal {
-  final int numLegs = 4;
-}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
deleted file mode 100644
index ba205d4..0000000
--- a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.weak.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library /*isNonNullableByDefault*/;
-import self as self;
-import "dart:core" as core;
-
-class Animal extends core::Object {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Animal
-    : super core::Object::•()
-    ;
-}
-@#C1
-class Cat extends core::Object implements self::Animal {
-  final field core::int numLegs = 4;
-  synthetic constructor •() → self::Cat
-    : super core::Object::•()
-    ;
-}
-static const field core::String valueClass = #C1;
-static method main() → dynamic {}
-
-constants  {
-  #C1 = "valueClass"
-}
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 9a256aa..3fc5a31 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
@@ -35,22 +35,22 @@
   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::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t2 = #t1.{core::Set::add}(inf::field1) in let final core::bool #t3 = #t1.{core::Set::add}(null) in #t1;
-  core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t5 = #t4.{core::Set::add}(inf::field2) in let final core::bool #t6 = #t4.{core::Set::add}(null) in #t4;
-  core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t8 = #t7.{core::Set::add}(inf::field3) in let final core::bool #t9 = #t7.{core::Set::add}(null) in #t7;
-  core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t11 = #t10.{core::Set::add}(inf::field4) in let final core::bool #t12 = #t10.{core::Set::add}(null) in #t10;
-  core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t14 = #t13.{core::Set::add}(inf::field5) in let final core::bool #t15 = #t13.{core::Set::add}(null) in #t13;
-  core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t17 = #t16.{core::Set::add}(inf::field6) in let final core::bool #t18 = #t16.{core::Set::add}(null) in #t16;
-  core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t20 = #t19.{core::Set::add}(inf::field7) in let final core::bool #t21 = #t19.{core::Set::add}(null) in #t19;
-  core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t23 = #t22.{core::Set::add}(inf::field8) in let final core::bool #t24 = #t22.{core::Set::add}(null) in #t22;
-  core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t26 = #t25.{core::Set::add}(null) in let final core::bool #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
-  core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = col::LinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t29 = #t28.{core::Set::add}(null) in let final core::bool #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
-  core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t32 = #t31.{core::Set::add}(null) in let final core::bool #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
-  core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t35 = #t34.{core::Set::add}(null) in let final core::bool #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
-  core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t38 = #t37.{core::Set::add}(null) in let final core::bool #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
-  core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = col::LinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t41 = #t40.{core::Set::add}(null) in let final core::bool #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
-  core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t44 = #t43.{core::Set::add}(null) in let final core::bool #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
-  core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = col::LinkedHashSet::•<core::int*>() in let final core::bool #t47 = #t46.{core::Set::add}(null) in let final core::bool #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
+  core::Set<inf::C<dynamic>*>* local2a = let final core::Set<inf::C<dynamic>*>* #t1 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t2 = #t1.{core::Set::add}(inf::field1) in let final core::bool #t3 = #t1.{core::Set::add}(null) in #t1;
+  core::Set<inf::C<dynamic>*>* local2b = let final core::Set<inf::C<dynamic>*>* #t4 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t5 = #t4.{core::Set::add}(inf::field2) in let final core::bool #t6 = #t4.{core::Set::add}(null) in #t4;
+  core::Set<inf::C<core::int*>*>* local2c = let final core::Set<inf::C<core::int*>*>* #t7 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t8 = #t7.{core::Set::add}(inf::field3) in let final core::bool #t9 = #t7.{core::Set::add}(null) in #t7;
+  core::Set<inf::C<core::int*>*>* local2d = let final core::Set<inf::C<core::int*>*>* #t10 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t11 = #t10.{core::Set::add}(inf::field4) in let final core::bool #t12 = #t10.{core::Set::add}(null) in #t10;
+  core::Set<inf::C<core::int*>*>* local2e = let final core::Set<inf::C<core::int*>*>* #t13 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t14 = #t13.{core::Set::add}(inf::field5) in let final core::bool #t15 = #t13.{core::Set::add}(null) in #t13;
+  core::Set<inf::C<core::int*>*>* local2f = let final core::Set<inf::C<core::int*>*>* #t16 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t17 = #t16.{core::Set::add}(inf::field6) in let final core::bool #t18 = #t16.{core::Set::add}(null) in #t16;
+  core::Set<core::int*>* local2g = let final core::Set<core::int*>* #t19 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t20 = #t19.{core::Set::add}(inf::field7) in let final core::bool #t21 = #t19.{core::Set::add}(null) in #t19;
+  core::Set<core::int*>* local2h = let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t23 = #t22.{core::Set::add}(inf::field8) in let final core::bool #t24 = #t22.{core::Set::add}(null) in #t22;
+  core::Set<inf::C<dynamic>*>* local3a = let final core::Set<inf::C<dynamic>*>* #t25 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t26 = #t25.{core::Set::add}(null) in let final core::bool #t27 = #t25.{core::Set::add}(inf::field1) in #t25;
+  core::Set<inf::C<dynamic>*>* local3b = let final core::Set<inf::C<dynamic>*>* #t28 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>*>() in let final core::bool #t29 = #t28.{core::Set::add}(null) in let final core::bool #t30 = #t28.{core::Set::add}(inf::field2) in #t28;
+  core::Set<inf::C<core::int*>*>* local3c = let final core::Set<inf::C<core::int*>*>* #t31 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t32 = #t31.{core::Set::add}(null) in let final core::bool #t33 = #t31.{core::Set::add}(inf::field3) in #t31;
+  core::Set<inf::C<core::int*>*>* local3d = let final core::Set<inf::C<core::int*>*>* #t34 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t35 = #t34.{core::Set::add}(null) in let final core::bool #t36 = #t34.{core::Set::add}(inf::field4) in #t34;
+  core::Set<inf::C<core::int*>*>* local3e = let final core::Set<inf::C<core::int*>*>* #t37 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t38 = #t37.{core::Set::add}(null) in let final core::bool #t39 = #t37.{core::Set::add}(inf::field5) in #t37;
+  core::Set<inf::C<core::int*>*>* local3f = let final core::Set<inf::C<core::int*>*>* #t40 = new col::_CompactLinkedHashSet::•<inf::C<core::int*>*>() in let final core::bool #t41 = #t40.{core::Set::add}(null) in let final core::bool #t42 = #t40.{core::Set::add}(inf::field6) in #t40;
+  core::Set<core::int*>* local3g = let final core::Set<core::int*>* #t43 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t44 = #t43.{core::Set::add}(null) in let final core::bool #t45 = #t43.{core::Set::add}(inf::field7) in #t43;
+  core::Set<core::int*>* local3h = let final core::Set<core::int*>* #t46 = new col::_CompactLinkedHashSet::•<core::int*>() in let final core::bool #t47 = #t46.{core::Set::add}(null) in let final core::bool #t48 = #t46.{core::Set::add}(inf::field8) in #t46;
 }
 
 library /*isNonNullableByDefault*/;
@@ -101,20 +101,20 @@
   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::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t50 = #t49.{core::Set::add}(inf::field1) in let final core::bool #t51 = #t49.{core::Set::add}(null) in #t49;
-  core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t53 = #t52.{core::Set::add}(inf::field2) in let final core::bool #t54 = #t52.{core::Set::add}(null) in #t52;
-  core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t56 = #t55.{core::Set::add}(inf::field3) in let final core::bool #t57 = #t55.{core::Set::add}(null) in #t55;
-  core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t59 = #t58.{core::Set::add}(inf::field4) in let final core::bool #t60 = #t58.{core::Set::add}(null) in #t58;
-  core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t62 = #t61.{core::Set::add}(inf::field5) in let final core::bool #t63 = #t61.{core::Set::add}(null) in #t61;
-  core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t65 = #t64.{core::Set::add}(inf::field6) in let final core::bool #t66 = #t64.{core::Set::add}(null) in #t64;
-  core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t68 = #t67.{core::Set::add}(inf::field7) in let final core::bool #t69 = #t67.{core::Set::add}(null) in #t67;
-  core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t71 = #t70.{core::Set::add}(inf::field8) in let final core::bool #t72 = #t70.{core::Set::add}(null) in #t70;
-  core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t74 = #t73.{core::Set::add}(null) in let final core::bool #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
-  core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = col::LinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t77 = #t76.{core::Set::add}(null) in let final core::bool #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
-  core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t80 = #t79.{core::Set::add}(null) in let final core::bool #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
-  core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = col::LinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t83 = #t82.{core::Set::add}(null) in let final core::bool #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
-  core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t86 = #t85.{core::Set::add}(null) in let final core::bool #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
-  core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = col::LinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t89 = #t88.{core::Set::add}(null) in let final core::bool #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
-  core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t92 = #t91.{core::Set::add}(null) in let final core::bool #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
-  core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = col::LinkedHashSet::•<core::int?>() in let final core::bool #t95 = #t94.{core::Set::add}(null) in let final core::bool #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
+  core::Set<inf::C<dynamic>?> local2a = let final core::Set<inf::C<dynamic>?> #t49 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t50 = #t49.{core::Set::add}(inf::field1) in let final core::bool #t51 = #t49.{core::Set::add}(null) in #t49;
+  core::Set<inf::C<dynamic>?> local2b = let final core::Set<inf::C<dynamic>?> #t52 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t53 = #t52.{core::Set::add}(inf::field2) in let final core::bool #t54 = #t52.{core::Set::add}(null) in #t52;
+  core::Set<inf::C<core::int>?> local2c = let final core::Set<inf::C<core::int>?> #t55 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t56 = #t55.{core::Set::add}(inf::field3) in let final core::bool #t57 = #t55.{core::Set::add}(null) in #t55;
+  core::Set<inf::C<core::int>?> local2d = let final core::Set<inf::C<core::int>?> #t58 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t59 = #t58.{core::Set::add}(inf::field4) in let final core::bool #t60 = #t58.{core::Set::add}(null) in #t58;
+  core::Set<inf::C<core::int?>?> local2e = let final core::Set<inf::C<core::int?>?> #t61 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t62 = #t61.{core::Set::add}(inf::field5) in let final core::bool #t63 = #t61.{core::Set::add}(null) in #t61;
+  core::Set<inf::C<core::int?>?> local2f = let final core::Set<inf::C<core::int?>?> #t64 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t65 = #t64.{core::Set::add}(inf::field6) in let final core::bool #t66 = #t64.{core::Set::add}(null) in #t64;
+  core::Set<core::int?> local2g = let final core::Set<core::int?> #t67 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t68 = #t67.{core::Set::add}(inf::field7) in let final core::bool #t69 = #t67.{core::Set::add}(null) in #t67;
+  core::Set<core::int?> local2h = let final core::Set<core::int?> #t70 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t71 = #t70.{core::Set::add}(inf::field8) in let final core::bool #t72 = #t70.{core::Set::add}(null) in #t70;
+  core::Set<inf::C<dynamic>?> local3a = let final core::Set<inf::C<dynamic>?> #t73 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t74 = #t73.{core::Set::add}(null) in let final core::bool #t75 = #t73.{core::Set::add}(inf::field1) in #t73;
+  core::Set<inf::C<dynamic>?> local3b = let final core::Set<inf::C<dynamic>?> #t76 = new col::_CompactLinkedHashSet::•<inf::C<dynamic>?>() in let final core::bool #t77 = #t76.{core::Set::add}(null) in let final core::bool #t78 = #t76.{core::Set::add}(inf::field2) in #t76;
+  core::Set<inf::C<core::int>?> local3c = let final core::Set<inf::C<core::int>?> #t79 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t80 = #t79.{core::Set::add}(null) in let final core::bool #t81 = #t79.{core::Set::add}(inf::field3) in #t79;
+  core::Set<inf::C<core::int>?> local3d = let final core::Set<inf::C<core::int>?> #t82 = new col::_CompactLinkedHashSet::•<inf::C<core::int>?>() in let final core::bool #t83 = #t82.{core::Set::add}(null) in let final core::bool #t84 = #t82.{core::Set::add}(inf::field4) in #t82;
+  core::Set<inf::C<core::int?>?> local3e = let final core::Set<inf::C<core::int?>?> #t85 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t86 = #t85.{core::Set::add}(null) in let final core::bool #t87 = #t85.{core::Set::add}(inf::field5) in #t85;
+  core::Set<inf::C<core::int?>?> local3f = let final core::Set<inf::C<core::int?>?> #t88 = new col::_CompactLinkedHashSet::•<inf::C<core::int?>?>() in let final core::bool #t89 = #t88.{core::Set::add}(null) in let final core::bool #t90 = #t88.{core::Set::add}(inf::field6) in #t88;
+  core::Set<core::int?> local3g = let final core::Set<core::int?> #t91 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t92 = #t91.{core::Set::add}(null) in let final core::bool #t93 = #t91.{core::Set::add}(inf::field7) in #t91;
+  core::Set<core::int?> local3h = let final core::Set<core::int?> #t94 = new col::_CompactLinkedHashSet::•<core::int?>() in let final core::bool #t95 = #t94.{core::Set::add}(null) in let final core::bool #t96 = #t94.{core::Set::add}(inf::field8) in #t94;
 }
diff --git a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
index 8546029..8c241d1 100644
--- a/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/nnbd_mixed/regress_null_aware.dart.weak.transformed.expect
@@ -34,5 +34,5 @@
 }
 static method main(dynamic args) → dynamic {
   if(false)
-    new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = col::LinkedHashSet::•<core::String*>() in #t6);
+    new self::Class::•().{self::Class::method}("", let final core::Set<core::String*>* #t6 = new col::_CompactLinkedHashSet::•<core::String*>() in #t6);
 }
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 f0a9892..68f6106 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
@@ -8,7 +8,7 @@
 
 static method test1(dynamic stringList) → dynamic {
   core::Set<core::int*>* intSet = block {
-    final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>();
+    final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>();
     final core::Iterable<dynamic>* #t2 = stringList as{TypeError,ForDynamic} core::Iterable<dynamic>*;
     if(!#t2.{core::Object::==}(null)) {
       core::Iterator<dynamic>* :sync-for-iterator = #t2.{core::Iterable::iterator};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
index c55d845..cc7cfa2 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -67,14 +67,14 @@
       #L1:
       {
         core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
-        core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>() in #t1;
-        core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>() in #t2;
+        core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = new col::_CompactLinkedHashSet::•<core::int*>() in #t1;
+        core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = new col::_CompactLinkedHashSet::•<core::int*>() in #t2;
         col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:13:28: Error: The set literal type 'Set<dynamic>' isn't of expected type 'LinkedHashSet<int>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
   LinkedHashSet<int> lhs = {};
-                           ^" in let final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
+                           ^" in let final core::Set<dynamic>* #t4 = new col::_CompactLinkedHashSet::•<dynamic>() in #t4;
         col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:14:34: Error: The map literal type 'Map<dynamic, dynamic>' isn't of expected type 'LinkedHashMap<int, bool>'.
  - 'Map' is from 'dart:core'.
  - 'LinkedHashMap' is from 'dart:collection'.
@@ -153,7 +153,7 @@
     try {
       #L3:
       {
-        :return_value = let final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>() in #t16;
+        :return_value = let final core::Set<core::int*>* #t16 = new col::_CompactLinkedHashSet::•<core::int*>() in #t16;
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -180,7 +180,7 @@
     try {
       #L4:
       {
-        :return_value = let final core::Set<core::int*>* #t17 = col::LinkedHashSet::•<core::int*>() in #t17;
+        :return_value = let final core::Set<core::int*>* #t17 = new col::_CompactLinkedHashSet::•<core::int*>() in #t17;
         break #L4;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -213,7 +213,7 @@
  - 'LinkedHashSet' is from 'dart:collection'.
 Change the type of the set literal or the context in which it is used.
 Future<LinkedHashSet<int>> lhsfun() async => {};
-                                             ^" in let final core::Set<dynamic>* #t19 = col::LinkedHashSet::•<dynamic>() in #t19;
+                                             ^" in let final core::Set<dynamic>* #t19 = new col::_CompactLinkedHashSet::•<dynamic>() in #t19;
         break #L5;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -264,15 +264,15 @@
 static method mapfun2() → FutureOr<core::Map<core::int*, core::bool*>*>*
   return <core::int*, core::bool*>{};
 static method setfun2() → FutureOr<core::Set<core::int*>*>*
-  return let final core::Set<core::int*>* #t21 = col::LinkedHashSet::•<core::int*>() in #t21;
+  return let final core::Set<core::int*>* #t21 = new col::_CompactLinkedHashSet::•<core::int*>() in #t21;
 static method iterablefun2() → FutureOr<core::Iterable<core::int*>*>*
-  return let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in #t22;
+  return let final core::Set<core::int*>* #t22 = new col::_CompactLinkedHashSet::•<core::int*>() in #t22;
 static method lhsfun2() → FutureOr<col::LinkedHashSet<core::int*>*>*
   return let final<BottomType> #t23 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:38:43: Error: A value of type 'Set<dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashSet<int>>'.
  - 'Set' is from 'dart:core'.
  - 'LinkedHashSet' is from 'dart:collection'.
 FutureOr<LinkedHashSet<int>> lhsfun2() => {};
-                                          ^" in (let final core::Set<dynamic>* #t24 = col::LinkedHashSet::•<dynamic>() in #t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
+                                          ^" in (let final core::Set<dynamic>* #t24 = new col::_CompactLinkedHashSet::•<dynamic>() in #t24) as{TypeError} FutureOr<col::LinkedHashSet<core::int*>*>*;
 static method lhmfun2() → FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return let final<BottomType> #t25 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:39:49: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'FutureOr<LinkedHashMap<int, bool>>'.
  - 'Map' is from 'dart:core'.
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index b1ab8a2..5fb1d61 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -252,3 +252,5 @@
 runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 set_literals/disambiguation_rule: RuntimeError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
\ No newline at end of file
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index b1c53c0..ef32a53 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -249,3 +249,6 @@
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 set_literals/disambiguation_rule: RuntimeError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
+
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart b/pkg/front_end/testcases/value_class/empty.dart
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart
rename to pkg/front_end/testcases/value_class/empty.dart
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect b/pkg/front_end/testcases/value_class/empty.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/empty.dart.outline.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.expect
rename to pkg/front_end/testcases/value_class/empty.dart.strong.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.strong.transformed.expect
rename to pkg/front_end/testcases/value_class/empty.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.expect
rename to pkg/front_end/testcases/value_class/empty.dart.weak.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/empty_test.dart.weak.transformed.expect
rename to pkg/front_end/testcases/value_class/empty.dart.weak.transformed.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart b/pkg/front_end/testcases/value_class/explicit_mixin.dart
similarity index 71%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
rename to pkg/front_end/testcases/value_class/explicit_mixin.dart
index 2cc85fc..5dadbc8 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart
@@ -4,11 +4,17 @@
 
 const String valueClass = "valueClass";
 
-class Animal {
-  final int numLegs = 4;
-}
+@valueClass
+class A {}
+
+class B {}
+
+class C {}
+
+class D = A with B;
+class E = B with A;
 
 @valueClass
-class Cat extends Animal {}
+class F = B with C;
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
new file mode 100644
index 0000000..0299405
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.outline.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    ;
+}
+class D = self::A with self::B {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E = self::B with self::A {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+@self::valueClass
+class F = self::B with self::C {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
new file mode 100644
index 0000000..34ca526
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D = self::A with self::B {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E = self::B with self::A {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+@#C1
+class F = self::B with self::C {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
new file mode 100644
index 0000000..b6394fb
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends self::A implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E extends self::B implements self::A /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+@#C1
+class F extends self::B implements self::C /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
new file mode 100644
index 0000000..34ca526
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D = self::A with self::B {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E = self::B with self::A {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+@#C1
+class F = self::B with self::C {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
new file mode 100644
index 0000000..b6394fb
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/explicit_mixin.dart.weak.transformed.expect
@@ -0,0 +1,42 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+class D extends self::A implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::D
+    : super self::A::•()
+    ;
+}
+class E extends self::B implements self::A /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::E
+    : super self::B::•()
+    ;
+}
+@#C1
+class F extends self::B implements self::C /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::F
+    : super self::B::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart b/pkg/front_end/testcases/value_class/non_final_field_error.dart
similarity index 94%
rename from pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
rename to pkg/front_end/testcases/value_class/non_final_field_error.dart
index 6c9da9d..1cb241b 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart
@@ -6,7 +6,7 @@
 
 @valueClass
 class Animal {
-  int? numLegs;
+  int numLegs;
 }
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
similarity index 90%
rename from pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
index 4353f25..0576b95 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_final_field_error_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.outline.expect
@@ -4,7 +4,7 @@
 
 @self::valueClass
 class Animal extends core::Object {
-  field core::int? numLegs;
+  field core::int numLegs;
   synthetic constructor •() → self::Animal
     ;
 }
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..c424f4f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_final_field_error.dart.weak.transformed.expect
@@ -0,0 +1,24 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_final_field_error.dart:9:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
similarity index 93%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
rename to pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
index 79b694c..00d89f6 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart
@@ -4,11 +4,11 @@
 
 const String valueClass = "valueClass";
 
+@valueClass
 class Animal {
-  int numLegs = 4;
+  final int numLegs;
 }
 
-@valueClass
 class Cat extends Animal {}
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_extends_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..257657f
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_extends_value_error.dart.weak.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_extends_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
similarity index 87%
copy from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
copy to pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
index 3800fa1..ee4bd91 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart
@@ -6,11 +6,11 @@
 
 @valueClass
 class Animal {
-  final int numLegs = 4;
+  final int numLegs;
 }
 
 class Cat implements Animal {
-  int numLegs = 4;
+  final int numLegs;
 }
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
similarity index 92%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
index 6303c33..1b24fca 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.outline.expect
@@ -9,7 +9,7 @@
     ;
 }
 class Cat extends core::Object implements self::Animal {
-  field core::int numLegs;
+  final field core::int numLegs;
   synthetic constructor •() → self::Cat
     ;
 }
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..a2359d2
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/non_value_implements_value_error.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/non_value_implements_value_error.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart b/pkg/front_end/testcases/value_class/simple.dart
new file mode 100644
index 0000000..e781016
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs;
+}
+
+main() {
+  Animal firstAnimal = Animal(numLegs: 4);
+  Animal secondAnimal = Animal(numLegs: 4);
+  Animal thirdAnimal = Animal(numLegs: 3);
+
+  expect(true, firstAnimal == secondAnimal);
+  expect(false, firstAnimal == thirdAnimal);
+
+  expect(true, firstAnimal.hashCode == secondAnimal.hashCode);
+  expect(false, firstAnimal.hashCode == thirdAnimal.hashCode);
+}
+
+expect(expected, actual, [expectNull = false]) {
+  if (expectNull) {
+    expected = null;
+  }
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
similarity index 77%
rename from pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/simple.dart.outline.expect
index e16fd84..03509b9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/simple_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/simple.dart.outline.expect
@@ -11,3 +11,5 @@
 static const field core::String valueClass = "valueClass";
 static method main() → dynamic
   ;
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull]) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
new file mode 100644
index 0000000..09bd934
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+//   Animal firstAnimal = Animal(numLegs: 4);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+//   Animal secondAnimal = Animal(numLegs: 4);
+//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+//   Animal thirdAnimal = Animal(numLegs: 3);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+  Animal firstAnimal = Animal(numLegs: 4);
+                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+  Animal secondAnimal = Animal(numLegs: 4);
+                               ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+  Animal thirdAnimal = Animal(numLegs: 3);
+                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+  self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+  self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+  self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
new file mode 100644
index 0000000..535162a
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.strong.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+//   Animal firstAnimal = Animal(numLegs: 4);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+//   Animal secondAnimal = Animal(numLegs: 4);
+//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+//   Animal thirdAnimal = Animal(numLegs: 3);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+  Animal firstAnimal = Animal(numLegs: 4);
+                              ^^^^^^^";
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+  Animal secondAnimal = Animal(numLegs: 4);
+                               ^^^^^^^";
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+  Animal thirdAnimal = Animal(numLegs: 3);
+                              ^^^^^^^";
+  self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+  self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+  self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+  self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
new file mode 100644
index 0000000..09bd934
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+//   Animal firstAnimal = Animal(numLegs: 4);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+//   Animal secondAnimal = Animal(numLegs: 4);
+//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+//   Animal thirdAnimal = Animal(numLegs: 3);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+  Animal firstAnimal = Animal(numLegs: 4);
+                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+  Animal secondAnimal = Animal(numLegs: 4);
+                               ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+  Animal thirdAnimal = Animal(numLegs: 3);
+                              ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Animal;
+  self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+  self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+  self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+  self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
new file mode 100644
index 0000000..535162a
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/simple.dart.weak.transformed.expect
@@ -0,0 +1,69 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+//   Animal firstAnimal = Animal(numLegs: 4);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+//   Animal secondAnimal = Animal(numLegs: 4);
+//                                ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+//   Animal thirdAnimal = Animal(numLegs: 3);
+//                               ^^^^^^^
+// pkg/front_end/testcases/value_class/simple.dart:8:7: Context: The class 'Animal' has a constructor that takes no arguments.
+// class Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/simple.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Animal firstAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:13:31: Error: No named parameter with the name 'numLegs'.
+  Animal firstAnimal = Animal(numLegs: 4);
+                              ^^^^^^^";
+  self::Animal secondAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:14:32: Error: No named parameter with the name 'numLegs'.
+  Animal secondAnimal = Animal(numLegs: 4);
+                               ^^^^^^^";
+  self::Animal thirdAnimal = invalid-expression "pkg/front_end/testcases/value_class/simple.dart:15:31: Error: No named parameter with the name 'numLegs'.
+  Animal thirdAnimal = Animal(numLegs: 3);
+                              ^^^^^^^";
+  self::expect(true, firstAnimal.{core::Object::==}(secondAnimal));
+  self::expect(false, firstAnimal.{core::Object::==}(thirdAnimal));
+  self::expect(true, firstAnimal.{core::Object::hashCode}.{core::num::==}(secondAnimal.{core::Object::hashCode}));
+  self::expect(false, firstAnimal.{core::Object::hashCode}.{core::num::==}(thirdAnimal.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart b/pkg/front_end/testcases/value_class/super_type.dart
new file mode 100644
index 0000000..4182161
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart
@@ -0,0 +1,37 @@
+// 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.
+
+const String valueClass = "valueClass";
+
+@valueClass
+class Animal {
+  final int numLegs;
+}
+
+@valueClass
+class Cat implements Animal {
+  final int numLegs;
+  final int numWhiskers;
+}
+
+main() {
+  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+
+  expect(true, firstCat == secondCat);
+  expect(false, firstCat == thirdCat);
+
+  expect(true, firstCat.hashCode == secondCat.hashCode);
+  expect(false, firstCat.hashCode == thirdCat.hashCode);
+}
+
+expect(expected, actual, [expectNull = false]) {
+  if (expectNull) {
+    expected = null;
+  }
+  if (expected != actual) {
+    throw 'Mismatch: expected=$expected, actual=$actual';
+  }
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
similarity index 84%
rename from pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/super_type.dart.outline.expect
index 72f354d..1f378c2 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart.outline.expect
+++ b/pkg/front_end/testcases/value_class/super_type.dart.outline.expect
@@ -18,3 +18,5 @@
 static const field core::String valueClass = "valueClass";
 static method main() → dynamic
   ;
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull]) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
new file mode 100644
index 0000000..ed5ed73
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numWhiskers;
+//             ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  final field core::int numWhiskers = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+                      ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::expect(true, firstCat.{core::Object::==}(secondCat));
+  self::expect(false, firstCat.{core::Object::==}(thirdCat));
+  self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+  self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..b21e4ae
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.strong.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numWhiskers;
+//             ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  final field core::int numWhiskers = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+                     ^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+                      ^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+                     ^^^^^^^";
+  self::expect(true, firstCat.{core::Object::==}(secondCat));
+  self::expect(false, firstCat.{core::Object::==}(thirdCat));
+  self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+  self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
new file mode 100644
index 0000000..ed5ed73
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numWhiskers;
+//             ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  final field core::int numWhiskers = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+                      ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+                     ^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} self::Cat;
+  self::expect(true, firstCat.{core::Object::==}(secondCat));
+  self::expect(false, firstCat.{core::Object::==}(thirdCat));
+  self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+  self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
new file mode 100644
index 0000000..b21e4ae
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/super_type.dart.weak.transformed.expect
@@ -0,0 +1,87 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+//   Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+//   Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+//                       ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+//   Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+//                      ^^^^^^^
+// pkg/front_end/testcases/value_class/super_type.dart:13:7: Context: The class 'Cat' has a constructor that takes no arguments.
+// class Cat implements Animal {
+//       ^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:9:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:14:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/super_type.dart:15:13: Error: Final field 'numWhiskers' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numWhiskers;
+//             ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  final field core::int numWhiskers = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {
+  self::Cat firstCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:19:22: Error: No named parameter with the name 'numLegs'.
+  Cat firstCat = Cat(numLegs: 4, numWhiskers: 10);
+                     ^^^^^^^";
+  self::Cat secondCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:20:23: Error: No named parameter with the name 'numLegs'.
+  Cat secondCat = Cat(numLegs: 4, numWhiskers: 10);
+                      ^^^^^^^";
+  self::Cat thirdCat = invalid-expression "pkg/front_end/testcases/value_class/super_type.dart:21:22: Error: No named parameter with the name 'numLegs'.
+  Cat thirdCat = Cat(numLegs: 4, numWhiskers: 0);
+                     ^^^^^^^";
+  self::expect(true, firstCat.{core::Object::==}(secondCat));
+  self::expect(false, firstCat.{core::Object::==}(thirdCat));
+  self::expect(true, firstCat.{core::Object::hashCode}.{core::num::==}(secondCat.{core::Object::hashCode}));
+  self::expect(false, firstCat.{core::Object::hashCode}.{core::num::==}(thirdCat.{core::Object::hashCode}));
+}
+static method expect(dynamic expected, dynamic actual, [dynamic expectNull = #C2]) → dynamic {
+  if(expectNull as{TypeError,ForDynamic,ForNonNullableByDefault} core::bool) {
+    expected = null;
+  }
+  if(!expected.{core::Object::==}(actual)) {
+    throw "Mismatch: expected=${expected}, actual=${actual}";
+  }
+}
+
+constants  {
+  #C1 = "valueClass"
+  #C2 = false
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/test.options b/pkg/front_end/testcases/value_class/test.options
similarity index 97%
rename from pkg/front_end/testcases/nnbd/value_classes/test.options
rename to pkg/front_end/testcases/value_class/test.options
index 81953a10..65e072c 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/test.options
+++ b/pkg/front_end/testcases/value_class/test.options
@@ -1 +1 @@
---enable-experiment=non-nullable,value-class
+--enable-experiment=non-nullable,value-class
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
similarity index 93%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
copy to pkg/front_end/testcases/value_class/value_extends_non_value.dart
index 79b694c..96bbf65 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart
@@ -5,7 +5,7 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  int numLegs = 4;
+  final int numLegs;
 }
 
 @valueClass
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
new file mode 100644
index 0000000..a196b35
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value.dart.weak.transformed.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends self::Animal {
+  synthetic constructor •() → self::Cat
+    : super self::Animal::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
similarity index 93%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
index 79b694c..bb077de 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart
@@ -5,7 +5,7 @@
 const String valueClass = "valueClass";
 
 class Animal {
-  int numLegs = 4;
+  int numLegs;
 }
 
 @valueClass
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_error_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.outline.expect
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
similarity index 62%
rename from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
rename to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.expect
@@ -1,9 +1,16 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = 4;
+  field core::int numLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.strong.transformed.expect
@@ -1,9 +1,16 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = 4;
+  field core::int numLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.expect
@@ -1,9 +1,16 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = 4;
+  field core::int numLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
similarity index 62%
copy from pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
copy to pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
index 7e25746..e0188c9 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/value_extends_non_value_test.dart.strong.expect
+++ b/pkg/front_end/testcases/value_class/value_extends_non_value_error.dart.weak.transformed.expect
@@ -1,9 +1,16 @@
 library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_extends_non_value_error.dart:8:7: Error: Field 'numLegs' should be initialized because its type 'int' doesn't allow null.
+//   int numLegs;
+//       ^^^^^^^
+//
 import self as self;
 import "dart:core" as core;
 
 class Animal extends core::Object {
-  final field core::int numLegs = 4;
+  field core::int numLegs = null;
   synthetic constructor •() → self::Animal
     : super core::Object::•()
     ;
diff --git a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
similarity index 87%
rename from pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
rename to pkg/front_end/testcases/value_class/value_implements_non_value.dart
index 3800fa1..cf2c4b0 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/non_value_implements_value_error_test.dart
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart
@@ -4,13 +4,13 @@
 
 const String valueClass = "valueClass";
 
-@valueClass
 class Animal {
-  final int numLegs = 4;
+  final int numLegs;
 }
 
+@valueClass
 class Cat implements Animal {
-  int numLegs = 4;
+  final int numLegs;
 }
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/nnbd/value_classes/value_implements_non_value_test.dart.outline.expect
rename to pkg/front_end/testcases/value_class/value_implements_non_value.dart.outline.expect
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
new file mode 100644
index 0000000..549053c
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_implements_non_value.dart.weak.transformed.expect
@@ -0,0 +1,36 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:8:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+// pkg/front_end/testcases/value_class/value_implements_non_value.dart:13:13: Error: Final field 'numLegs' is not initialized.
+// Try to initialize the field in the declaration or in every constructor.
+//   final int numLegs;
+//             ^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Animal extends core::Object {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Animal
+    : super core::Object::•()
+    ;
+}
+@#C1
+class Cat extends core::Object implements self::Animal {
+  final field core::int numLegs = null;
+  synthetic constructor •() → self::Cat
+    : super core::Object::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart b/pkg/front_end/testcases/value_class/value_mixin_error.dart
similarity index 65%
rename from pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
rename to pkg/front_end/testcases/value_class/value_mixin_error.dart
index d57a05b..22c8a1f 100644
--- a/pkg/front_end/testcases/nnbd/value_classes/super_type_test.dart
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart
@@ -5,14 +5,11 @@
 const String valueClass = "valueClass";
 
 @valueClass
-class Animal {
-  final int numLegs = 4;
-}
+class A {}
 
-@valueClass
-class Cat implements Animal {
-  final int numLegs = 4;
-  final int numWhiskers = 4;
-}
+class B {}
+
+class C extends B with A {} // error, value class as mixin
+class C extends A with B {} // error, C extends a value class
 
 main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
new file mode 100644
index 0000000..a5b1239
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.outline.expect
@@ -0,0 +1,44 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+//       ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+@self::valueClass
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C#1 extends self::_C&A&B {
+  synthetic constructor •() → self::C#1
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+static const field core::String valueClass = "valueClass";
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
new file mode 100644
index 0000000..46047b4
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+//       ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C#1 extends self::_C&A&B {
+  synthetic constructor •() → self::C#1
+    : super self::_C&A&B::•()
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    : super self::_C&B&A::•()
+    ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..0a9c8b9
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+//       ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C#1 extends self::_C&A&B {
+  synthetic constructor •() → self::C#1
+    : super self::_C&A&B::•()
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    : super self::_C&B&A::•()
+    ;
+}
+abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
new file mode 100644
index 0000000..46047b4
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+//       ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+abstract class _C&B&A = self::B with self::A /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C#1 extends self::_C&A&B {
+  synthetic constructor •() → self::C#1
+    : super self::_C&A&B::•()
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    : super self::_C&B&A::•()
+    ;
+}
+abstract class _C&A&B = self::A with self::B /*isAnonymousMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
new file mode 100644
index 0000000..0a9c8b9
--- /dev/null
+++ b/pkg/front_end/testcases/value_class/value_mixin_error.dart.weak.transformed.expect
@@ -0,0 +1,51 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:13:7: Error: 'C' is already declared in this scope.
+// class C extends A with B {} // error, C extends a value class
+//       ^
+// pkg/front_end/testcases/value_class/value_mixin_error.dart:12:7: Context: Previous declaration of 'C'.
+// class C extends B with A {} // error, value class as mixin
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class A extends core::Object {
+  synthetic constructor •() → self::A
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+abstract class _C&B&A extends self::B implements self::A /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&B&A
+    : super self::B::•()
+    ;
+}
+class C#1 extends self::_C&A&B {
+  synthetic constructor •() → self::C#1
+    : super self::_C&A&B::•()
+    ;
+}
+class C extends self::_C&B&A {
+  synthetic constructor •() → self::C
+    : super self::_C&B&A::•()
+    ;
+}
+abstract class _C&A&B extends self::A implements self::B /*isAnonymousMixin,isEliminatedMixin*/  {
+  synthetic constructor •() → self::_C&A&B
+    : super self::A::•()
+    ;
+}
+static const field core::String valueClass = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = "valueClass"
+}
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 3526184..8df9de3 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -72,3 +72,6 @@
 nnbd_mixed/messages_with_types_opt_in: TypeCheckError
 nnbd_mixed/messages_with_types_opt_out: TypeCheckError
 nnbd_mixed/never_opt_out: TypeCheckError
+value_class/simple: RuntimeError # Expected
+value_class/super_type: RuntimeError # Expected
+
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index e841c9d..4ddeafc 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -716,7 +716,7 @@
       // mode.
       if (_configuration.useElf && arguments.last.contains("deferred")) ...[
         "--loading-unit-manifest=$tempDir/ignored.json",
-        "--use-bare-instructions=false",
+        "--use-table-dispatch=false",
       ],
       if (_isAndroid && _isArm) '--no-sim-use-hardfp',
       if (_configuration.isMinified) '--obfuscate',
diff --git a/pkg/vm/lib/transformations/list_factory_specializer.dart b/pkg/vm/lib/transformations/list_factory_specializer.dart
deleted file mode 100644
index 37417ca..0000000
--- a/pkg/vm/lib/transformations/list_factory_specializer.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright (c) 2018, 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 vm.transformations.list_factory_specializer;
-
-import 'package:kernel/ast.dart';
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-/// Replaces invocation of List factory constructors with
-/// factories of VM-specific classes.
-///
-/// new List() => new _GrowableList(0)
-/// new List(n) => new _List(n)
-/// new List.filled(n, null, growable: true) => new _GrowableList(n)
-/// new List.filled(n, x, growable: true) => new _GrowableList.filled(n, x)
-/// new List.filled(n, null) => new _List(n)
-/// new List.filled(n, x) => new _List.filled(n, x)
-/// new List.generate(n, y) => new _GrowableList.generate(n, y)
-/// new List.generate(n, y, growable: false) => new _List.generate(n, y)
-///
-class ListFactorySpecializer {
-  final Procedure _defaultListFactory;
-  final Procedure _listFilledFactory;
-  final Procedure _listGenerateFactory;
-  final Procedure _growableListFactory;
-  final Procedure _growableListFilledFactory;
-  final Procedure _growableListGenerateFactory;
-  final Procedure _fixedListFactory;
-  final Procedure _fixedListFilledFactory;
-  final Procedure _fixedListGenerateFactory;
-
-  ListFactorySpecializer(CoreTypes coreTypes)
-      : _defaultListFactory =
-            coreTypes.index.getMember('dart:core', 'List', ''),
-        _listFilledFactory =
-            coreTypes.index.getMember('dart:core', 'List', 'filled'),
-        _listGenerateFactory =
-            coreTypes.index.getMember('dart:core', 'List', 'generate'),
-        _growableListFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', ''),
-        _growableListFilledFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
-        _growableListGenerateFactory =
-            coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
-        _fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
-        _fixedListFilledFactory =
-            coreTypes.index.getMember('dart:core', '_List', 'filled'),
-        _fixedListGenerateFactory =
-            coreTypes.index.getMember('dart:core', '_List', 'generate') {
-    assert(_defaultListFactory.isFactory);
-    assert(_listFilledFactory.isFactory);
-    assert(_listGenerateFactory.isFactory);
-    assert(_growableListFactory.isFactory);
-    assert(_growableListFilledFactory.isFactory);
-    assert(_growableListGenerateFactory.isFactory);
-    assert(_fixedListFactory.isFactory);
-    assert(_fixedListFilledFactory.isFactory);
-    assert(_fixedListGenerateFactory.isFactory);
-  }
-
-  TreeNode transformStaticInvocation(StaticInvocation node) {
-    final target = node.target;
-    if (target == _defaultListFactory) {
-      final args = node.arguments;
-      if (args.positional.isEmpty) {
-        return StaticInvocation(_growableListFactory,
-            Arguments([new IntLiteral(0)], types: args.types))
-          ..fileOffset = node.fileOffset;
-      } else {
-        return StaticInvocation(_fixedListFactory, args)
-          ..fileOffset = node.fileOffset;
-      }
-    } else if (target == _listFilledFactory) {
-      final args = node.arguments;
-      assert(args.positional.length == 2);
-      final length = args.positional[0];
-      final fill = args.positional[1];
-      final fillingWithNull = fill is NullLiteral ||
-          (fill is ConstantExpression && fill.constant is NullConstant);
-      final bool growable =
-          _getConstantOptionalArgument(args, 'growable', false);
-      if (growable == null) {
-        return node;
-      }
-      if (growable) {
-        if (fillingWithNull) {
-          return StaticInvocation(
-              _growableListFactory, Arguments([length], types: args.types))
-            ..fileOffset = node.fileOffset;
-        } else {
-          return StaticInvocation(_growableListFilledFactory,
-              Arguments([length, fill], types: args.types))
-            ..fileOffset = node.fileOffset;
-        }
-      } else {
-        if (fillingWithNull) {
-          return StaticInvocation(
-              _fixedListFactory, Arguments([length], types: args.types))
-            ..fileOffset = node.fileOffset;
-        } else {
-          return StaticInvocation(_fixedListFilledFactory,
-              Arguments([length, fill], types: args.types))
-            ..fileOffset = node.fileOffset;
-        }
-      }
-    } else if (target == _listGenerateFactory) {
-      final args = node.arguments;
-      assert(args.positional.length == 2);
-      final length = args.positional[0];
-      final generator = args.positional[1];
-      final bool growable =
-          _getConstantOptionalArgument(args, 'growable', true);
-      if (growable == null) {
-        return node;
-      }
-      if (growable) {
-        return StaticInvocation(_growableListGenerateFactory,
-            Arguments([length, generator], types: args.types))
-          ..fileOffset = node.fileOffset;
-      } else {
-        return StaticInvocation(_fixedListGenerateFactory,
-            Arguments([length, generator], types: args.types))
-          ..fileOffset = node.fileOffset;
-      }
-    }
-
-    return node;
-  }
-
-  /// Returns constant value of the only optional argument in [args],
-  /// or null if it is not a constant. Returns [defaultValue] if optional
-  /// argument is not passed. Argument is asserted to have the given [name].
-  bool /*?*/ _getConstantOptionalArgument(
-      Arguments args, String name, bool defaultValue) {
-    if (args.named.isEmpty) {
-      return defaultValue;
-    }
-    final namedArg = args.named.single;
-    assert(namedArg.name == name);
-    final value = namedArg.value;
-    if (value is BoolLiteral) {
-      return value.value;
-    } else if (value is ConstantExpression) {
-      final constant = value.constant;
-      if (constant is BoolConstant) {
-        return constant.value;
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index 3e3e410..19fee1a 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -9,9 +9,8 @@
     as typeCastsOptimizer show transformAsExpression;
 import 'package:kernel/type_environment.dart'
     show StaticTypeContext, TypeEnvironment;
-
+import 'package:vm/transformations/specializer/factory_specializer.dart';
 import 'late_var_init_transformer.dart' show LateVarInitTransformer;
-import 'list_factory_specializer.dart' show ListFactorySpecializer;
 
 /// VM-specific lowering transformations and optimizations combined into a
 /// single transformation pass.
@@ -27,16 +26,16 @@
 class _Lowering extends Transformer {
   final TypeEnvironment env;
   final bool nullSafety;
-  final ListFactorySpecializer listFactorySpecializer;
   final LateVarInitTransformer lateVarInitTransformer;
+  final FactorySpecializer factorySpecializer;
 
   Member _currentMember;
   StaticTypeContext _cachedStaticTypeContext;
 
   _Lowering(CoreTypes coreTypes, ClassHierarchy hierarchy, this.nullSafety)
       : env = TypeEnvironment(coreTypes, hierarchy),
-        listFactorySpecializer = ListFactorySpecializer(coreTypes),
-        lateVarInitTransformer = LateVarInitTransformer();
+        lateVarInitTransformer = LateVarInitTransformer(),
+        factorySpecializer = FactorySpecializer(coreTypes);
 
   StaticTypeContext get _staticTypeContext =>
       _cachedStaticTypeContext ??= StaticTypeContext(_currentMember, env);
@@ -56,7 +55,7 @@
   @override
   visitStaticInvocation(StaticInvocation node) {
     node.transformChildren(this);
-    return listFactorySpecializer.transformStaticInvocation(node);
+    return factorySpecializer.transformStaticInvocation(node);
   }
 
   @override
diff --git a/pkg/vm/lib/transformations/specializer/factory_specializer.dart b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
new file mode 100644
index 0000000..02a3cfe
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/factory_specializer.dart
@@ -0,0 +1,46 @@
+// 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 vm.transformations.specializer.factory_specializer;
+
+import 'package:kernel/kernel.dart';
+import 'package:kernel/core_types.dart';
+import 'package:vm/transformations/specializer/list_factory_specializer.dart';
+import 'package:vm/transformations/specializer/map_factory_specializer.dart';
+import 'package:vm/transformations/specializer/set_factory_specializer.dart';
+
+typedef SpecializerTransformer = TreeNode Function(StaticInvocation node);
+
+abstract class BaseSpecializer {
+  // Populated in constructors of subclasses.
+  final Map<Member, SpecializerTransformer> transformers = {};
+}
+
+class FactorySpecializer extends BaseSpecializer {
+  final ListFactorySpecializer _listFactorySpecializer;
+  final SetFactorySpecializer _setFactorySpecializer;
+  final MapFactorySpecializer _mapFactorySpecializer;
+
+  FactorySpecializer(CoreTypes coreTypes)
+      : _listFactorySpecializer = ListFactorySpecializer(coreTypes),
+        _setFactorySpecializer = SetFactorySpecializer(coreTypes),
+        _mapFactorySpecializer = MapFactorySpecializer(coreTypes) {
+    transformers.addAll(_listFactorySpecializer.transformers);
+    transformers.addAll(_setFactorySpecializer.transformers);
+    transformers.addAll(_mapFactorySpecializer.transformers);
+  }
+
+  TreeNode transformStaticInvocation(StaticInvocation invocation) {
+    final target = invocation.target;
+    if (target == null) {
+      return invocation;
+    }
+
+    final transformer = transformers[target];
+    if (transformer != null) {
+      return transformer(invocation);
+    }
+    return invocation;
+  }
+}
diff --git a/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
new file mode 100644
index 0000000..38e5913
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/list_factory_specializer.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2018, 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 vm.transformations.specializer.list_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of List factory constructors with
+/// factories of VM-specific classes.
+///
+/// new List() => new _GrowableList(0)
+/// new List(n) => new _List(n)
+/// new List.filled(n, null, growable: true) => new _GrowableList(n)
+/// new List.filled(n, x, growable: true) => new _GrowableList.filled(n, x)
+/// new List.filled(n, null) => new _List(n)
+/// new List.filled(n, x) => new _List.filled(n, x)
+/// new List.generate(n, y) => new _GrowableList.generate(n, y)
+/// new List.generate(n, y, growable: false) => new _List.generate(n, y)
+///
+class ListFactorySpecializer extends BaseSpecializer {
+  final Procedure _defaultListFactory;
+  final Procedure _listFilledFactory;
+  final Procedure _listGenerateFactory;
+  final Procedure _growableListFactory;
+  final Procedure _growableListFilledFactory;
+  final Procedure _growableListGenerateFactory;
+  final Procedure _fixedListFactory;
+  final Procedure _fixedListFilledFactory;
+  final Procedure _fixedListGenerateFactory;
+
+  ListFactorySpecializer(CoreTypes coreTypes)
+      : _defaultListFactory =
+            coreTypes.index.getMember('dart:core', 'List', ''),
+        _listFilledFactory =
+            coreTypes.index.getMember('dart:core', 'List', 'filled'),
+        _listGenerateFactory =
+            coreTypes.index.getMember('dart:core', 'List', 'generate'),
+        _growableListFactory =
+            coreTypes.index.getMember('dart:core', '_GrowableList', ''),
+        _growableListFilledFactory =
+            coreTypes.index.getMember('dart:core', '_GrowableList', 'filled'),
+        _growableListGenerateFactory =
+            coreTypes.index.getMember('dart:core', '_GrowableList', 'generate'),
+        _fixedListFactory = coreTypes.index.getMember('dart:core', '_List', ''),
+        _fixedListFilledFactory =
+            coreTypes.index.getMember('dart:core', '_List', 'filled'),
+        _fixedListGenerateFactory =
+            coreTypes.index.getMember('dart:core', '_List', 'generate') {
+    assert(_defaultListFactory.isFactory);
+    assert(_listFilledFactory.isFactory);
+    assert(_listGenerateFactory.isFactory);
+    assert(_growableListFactory.isFactory);
+    assert(_growableListFilledFactory.isFactory);
+    assert(_growableListGenerateFactory.isFactory);
+    assert(_fixedListFactory.isFactory);
+    assert(_fixedListFilledFactory.isFactory);
+    assert(_fixedListGenerateFactory.isFactory);
+    transformers.addAll({
+      _defaultListFactory: transformDefaultFactory,
+      _listFilledFactory: transformListFilledFactory,
+      _listGenerateFactory: transformListGeneratorFactory,
+    });
+  }
+
+  TreeNode transformDefaultFactory(StaticInvocation node) {
+    final args = node.arguments;
+    if (args.positional.isEmpty) {
+      return StaticInvocation(_growableListFactory,
+          Arguments([new IntLiteral(0)], types: args.types))
+        ..fileOffset = node.fileOffset;
+    } else {
+      return StaticInvocation(_fixedListFactory, args)
+        ..fileOffset = node.fileOffset;
+    }
+  }
+
+  TreeNode transformListFilledFactory(StaticInvocation node) {
+    final args = node.arguments;
+    assert(args.positional.length == 2);
+    final length = args.positional[0];
+    final fill = args.positional[1];
+    final fillingWithNull = fill is NullLiteral ||
+        (fill is ConstantExpression && fill.constant is NullConstant);
+    final bool growable = _getConstantOptionalArgument(args, 'growable', false);
+    if (growable == null) {
+      return node;
+    }
+    if (growable) {
+      if (fillingWithNull) {
+        return StaticInvocation(
+            _growableListFactory, Arguments([length], types: args.types))
+          ..fileOffset = node.fileOffset;
+      } else {
+        return StaticInvocation(_growableListFilledFactory,
+            Arguments([length, fill], types: args.types))
+          ..fileOffset = node.fileOffset;
+      }
+    } else {
+      if (fillingWithNull) {
+        return StaticInvocation(
+            _fixedListFactory, Arguments([length], types: args.types))
+          ..fileOffset = node.fileOffset;
+      } else {
+        return StaticInvocation(_fixedListFilledFactory,
+            Arguments([length, fill], types: args.types))
+          ..fileOffset = node.fileOffset;
+      }
+    }
+  }
+
+  TreeNode transformListGeneratorFactory(StaticInvocation node) {
+    final args = node.arguments;
+    assert(args.positional.length == 2);
+    final length = args.positional[0];
+    final generator = args.positional[1];
+    final bool growable = _getConstantOptionalArgument(args, 'growable', true);
+    if (growable == null) {
+      return node;
+    }
+    if (growable) {
+      return StaticInvocation(_growableListGenerateFactory,
+          Arguments([length, generator], types: args.types))
+        ..fileOffset = node.fileOffset;
+    } else {
+      return StaticInvocation(_fixedListGenerateFactory,
+          Arguments([length, generator], types: args.types))
+        ..fileOffset = node.fileOffset;
+    }
+  }
+
+  /// Returns constant value of the only optional argument in [args],
+  /// or null if it is not a constant. Returns [defaultValue] if optional
+  /// argument is not passed. Argument is asserted to have the given [name].
+  bool /*?*/ _getConstantOptionalArgument(
+      Arguments args, String name, bool defaultValue) {
+    if (args.named.isEmpty) {
+      return defaultValue;
+    }
+    final namedArg = args.named.single;
+    assert(namedArg.name == name);
+    final value = namedArg.value;
+    if (value is BoolLiteral) {
+      return value.value;
+    } else if (value is ConstantExpression) {
+      final constant = value.constant;
+      if (constant is BoolConstant) {
+        return constant.value;
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
new file mode 100644
index 0000000..5779807
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/map_factory_specializer.dart
@@ -0,0 +1,56 @@
+// 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 vm.transformations.specializer.map_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
+import 'dart:core';
+
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of Map factory constructors with
+/// factories of VM-specific classes.
+/// new LinkedHashMap<K, V>() => new _InternalLinkedHashMap<K, V>()
+class MapFactorySpecializer extends BaseSpecializer {
+  final Procedure _linkedHashMapDefaultFactory;
+  final Constructor _internalLinkedHashMapConstructor;
+
+  MapFactorySpecializer(CoreTypes coreTypes)
+      : _linkedHashMapDefaultFactory = assertNotNull(
+          coreTypes.index.getMember(
+            'dart:collection',
+            'LinkedHashMap',
+            '',
+          ),
+        ),
+        _internalLinkedHashMapConstructor = assertNotNull(
+          coreTypes.index.getMember(
+            'dart:collection',
+            '_InternalLinkedHashMap',
+            '',
+          ),
+        ) {
+    transformers.addAll({
+      _linkedHashMapDefaultFactory: transformLinkedHashMap,
+    });
+  }
+
+  static T assertNotNull<T>(T t) {
+    assert(t != null);
+    return t;
+  }
+
+  TreeNode transformLinkedHashMap(StaticInvocation node) {
+    final args = node.arguments;
+    if (args.named.isEmpty) {
+      return ConstructorInvocation(
+        _internalLinkedHashMapConstructor,
+        Arguments([], types: args.types),
+      )..fileOffset = node.fileOffset;
+    }
+
+    return node;
+  }
+}
diff --git a/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
new file mode 100644
index 0000000..0e6a855
--- /dev/null
+++ b/pkg/vm/lib/transformations/specializer/set_factory_specializer.dart
@@ -0,0 +1,56 @@
+// 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 vm.transformations.specializer.set_factory_specializer;
+
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/core_types.dart';
+import 'package:vm/transformations/specializer/factory_specializer.dart';
+
+/// Replaces invocation of Set factory constructors with
+/// factories of VM-specific classes.
+/// new LinkedHashSet<E>() => new _CompactLinkedHashSet<E>()
+class SetFactorySpecializer extends BaseSpecializer {
+  final Procedure _linkedHashSetDefaultFactory;
+  final Constructor _compactLinkedHashSetConstructor;
+
+  SetFactorySpecializer(CoreTypes coreTypes)
+      : _linkedHashSetDefaultFactory = assertNotNull(
+          coreTypes.index.getMember(
+            'dart:collection',
+            'LinkedHashSet',
+            '',
+          ),
+        ),
+        _compactLinkedHashSetConstructor = assertNotNull(
+          coreTypes.index.getMember(
+            'dart:collection',
+            '_CompactLinkedHashSet',
+            '',
+          ),
+        ) {
+    transformers.addAll({
+      _linkedHashSetDefaultFactory: transformLinkedHashSet,
+    });
+  }
+
+  static T assertNotNull<T>(T t) {
+    assert(t != null);
+    return t;
+  }
+
+  TreeNode transformLinkedHashSet(StaticInvocation node) {
+    final args = node.arguments;
+    assert(args.positional.isEmpty);
+    if (args.named.isEmpty) {
+      return ConstructorInvocation(
+        _compactLinkedHashSetConstructor,
+        Arguments([], types: args.types),
+      );
+    }
+    return node;
+  }
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart
new file mode 100644
index 0000000..ef432be
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart
@@ -0,0 +1,41 @@
+import 'dart:collection';
+import 'dart:core';
+
+main() {
+  // Set
+  print(globalSet);
+  print(identitySet);
+  print(linkedSet);
+  print(linkedIdentitySet);
+  print(linkedCustomSet);
+  // Map
+  print(globalMap);
+  print(globalMapLiteral);
+  print(identityMap);
+  print(unmodifiableMap);
+  print(linkedMap);
+  print(linkedIdentityMap);
+  print(linkedCustomMap);
+}
+
+Set globalSet = Set();
+Set identitySet = Set.identity();
+Set<String> linkedSet = new LinkedHashSet<String>();
+Set<String> linkedIdentitySet =
+    new LinkedHashSet<String>(equals: identical, hashCode: identityHashCode);
+Set<String> linkedCustomSet = new LinkedHashSet<String>(
+    equals: (a, b) => a == b,
+    hashCode: (o) => o.hashCode,
+    isValidKey: (o) => true);
+
+Map globalMap = Map();
+Map identityMap = Map.identity();
+Map unmodifiableMap = Map.unmodifiable(identityMap);
+Map globalMapLiteral = {};
+Map<String, String> linkedMap = new LinkedHashMap<String, String>();
+Map<String, String> linkedIdentityMap =
+    new LinkedHashMap(equals: identical, hashCode: identityHashCode);
+Map<String, String> linkedCustomMap = new LinkedHashMap(
+    equals: (a, b) => a == b,
+    hashCode: (o) => o.hashCode,
+    isValidKey: (o) => true);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
new file mode 100644
index 0000000..fa2eda6
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/set_map_constructor_concrete.dart.expect
@@ -0,0 +1,34 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+import "dart:collection" as col;
+
+import "dart:collection";
+import "dart:core";
+
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>]static field core::Set<dynamic>* globalSet = new col::_CompactLinkedHashSet::•<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>]static field core::Set<dynamic>* identitySet = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet<dynamic>] col::LinkedHashSet::identity<dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>]static field core::Set<core::String*>* linkedSet = new col::_CompactLinkedHashSet::•<core::String*>();
+static field core::Set<core::String*>* linkedIdentitySet = let (core::Object?, core::Object?) → core::bool #t1 = #C1 in let (core::Object?) → core::int #t2 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t1, #t2);
+static field core::Set<core::String*>* linkedCustomSet = let (core::String*, core::String*) →* core::bool* #t3 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t4 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t5 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashSet::•<core::String*>(#t3, #t4, isValidKey: #t5);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMap = [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<dynamic, dynamic>] core::Map::•<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* identityMap = [@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap<dynamic, dynamic>] col::LinkedHashMap::identity<dynamic, dynamic>();
+[@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* unmodifiableMap = [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dynamic, dynamic>] core::Map::unmodifiable<dynamic, dynamic>([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>]static field core::Map<dynamic, dynamic>* globalMapLiteral = <dynamic, dynamic>{};
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>]static field core::Map<core::String*, core::String*>* linkedMap = new col::_InternalLinkedHashMap::•<core::String*, core::String*>();
+static field core::Map<core::String*, core::String*>* linkedIdentityMap = let (core::Object?, core::Object?) → core::bool #t6 = #C1 in let (core::Object?) → core::int #t7 = #C2 in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t6, #t7);
+static field core::Map<core::String*, core::String*>* linkedCustomMap = let (core::String*, core::String*) →* core::bool* #t8 = (core::String* a, core::String* b) → core::bool* => a.{core::String::==}(b) in let (core::String*) →* core::int* #t9 = (core::String* o) → core::int* => o.{core::String::hashCode} in let (dynamic) →* core::bool* #t10 = (dynamic o) → core::bool* => true in [@vm.inferred-type.metadata=!] col::LinkedHashMap::•<core::String*, core::String*>(#t8, #t9, isValidKey: #t10);
+static method main() → dynamic {
+  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dynamic>] self::globalSet);
+  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashSet?<dynamic>] self::identitySet);
+  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedHashSet?<dart.core::String*>] self::linkedSet);
+  core::print(self::linkedIdentitySet);
+  core::print(self::linkedCustomSet);
+  core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMap);
+  core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dynamic, dynamic>] self::globalMapLiteral);
+  core::print([@vm.inferred-type.metadata=dart.collection::_CompactLinkedIdentityHashMap?<dynamic, dynamic>] self::identityMap);
+  core::print([@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView?<dynamic, dynamic>] self::unmodifiableMap);
+  core::print([@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap?<dart.core::String*, dart.core::String*>] self::linkedMap);
+  core::print(self::linkedIdentityMap);
+  core::print(self::linkedCustomMap);
+}
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index bbd3d2ca..8eebaed 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -1141,6 +1141,18 @@
 DART_EXPORT void Dart_KillIsolate(Dart_Isolate isolate);
 
 /**
+ * Notifies the VM that the embedder expects |size| bytes of memory have become
+ * unreachable. The VM may use this hint to adjust the garbage collector's
+ * growth policy.
+ *
+ * Multiple calls are interpreted as increasing, not replacing, the estimate of
+ * unreachable memory.
+ *
+ * Requires there to be a current isolate.
+ */
+DART_EXPORT void Dart_HintFreed(intptr_t size);
+
+/**
  * Notifies the VM that the embedder expects to be idle until |deadline|. The VM
  * may use this time to perform garbage collection or other tasks to avoid
  * delays during execution of Dart code in the future.
diff --git a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
index 8231f00..1663e3a 100644
--- a/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart/incompatible_loading_unit_test.dart
@@ -60,7 +60,7 @@
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-bare-instructions=false",
+      "--use-table-dispatch=false",
       "--elf=$snapshot1",
       "--loading-unit-manifest=$manifest1",
       dill1,
@@ -71,7 +71,7 @@
 
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-bare-instructions=false",
+      "--use-table-dispatch=false",
       "--elf=$snapshot2",
       "--loading-unit-manifest=$manifest2",
       dill2,
diff --git a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
index 8231f00..1663e3a 100644
--- a/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
+++ b/runtime/tests/vm/dart_2/incompatible_loading_unit_test.dart
@@ -60,7 +60,7 @@
     // Compile kernel to ELF.
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-bare-instructions=false",
+      "--use-table-dispatch=false",
       "--elf=$snapshot1",
       "--loading-unit-manifest=$manifest1",
       dill1,
@@ -71,7 +71,7 @@
 
     await run(genSnapshot, <String>[
       "--snapshot-kind=app-aot-elf",
-      "--use-bare-instructions=false",
+      "--use-table-dispatch=false",
       "--elf=$snapshot2",
       "--loading-unit-manifest=$manifest2",
       dill2,
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 956b5ee..f02d468 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -718,9 +718,9 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    if (kind == Snapshot::kFullAOT) {
-      Function& func = Function::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    if (d->kind() == Snapshot::kFullAOT) {
+      Function& func = Function::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         func ^= refs.At(i);
         ASSERT(func.raw()->ptr()->code_->IsCode());
@@ -732,9 +732,9 @@
         ASSERT(unchecked_entry_point != 0);
         func.raw()->ptr()->unchecked_entry_point_ = unchecked_entry_point;
       }
-    } else if (kind == Snapshot::kFullJIT) {
-      Function& func = Function::Handle(zone);
-      Code& code = Code::Handle(zone);
+    } else if (d->kind() == Snapshot::kFullJIT) {
+      Function& func = Function::Handle(d->zone());
+      Code& code = Code::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         func ^= refs.At(i);
         code = func.CurrentCode();
@@ -746,7 +746,7 @@
         }
       }
     } else {
-      Function& func = Function::Handle(zone);
+      Function& func = Function::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         func ^= refs.At(i);
         func.ClearCode();  // Set code and entrypoint to lazy compile stub.
@@ -1203,8 +1203,8 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    Field& field = Field::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    Field& field = Field::Handle(d->zone());
     if (!Isolate::Current()->use_field_guards()) {
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         field ^= refs.At(i);
@@ -1501,9 +1501,9 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    Array& array = Array::Handle(zone);
-    KernelProgramInfo& info = KernelProgramInfo::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    Array& array = Array::Handle(d->zone());
+    KernelProgramInfo& info = KernelProgramInfo::Handle(d->zone());
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       info ^= refs.At(id);
       array = HashTables::New<UnorderedHashMap<SmiTraits>>(16, Heap::kOld);
@@ -1522,9 +1522,10 @@
 
   void Trace(Serializer* s, ObjectPtr object) {
     CodePtr code = Code::RawCast(object);
-    objects_.Add(code);
 
-    s->InCurrentLoadingUnit(code, /*record*/ true);
+    if (s->InCurrentLoadingUnit(code, /*record*/ true)) {
+      objects_.Add(code);
+    }
 
     if (!(s->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
       s->Push(code->ptr()->object_pool_);
@@ -1571,7 +1572,77 @@
 #endif
   }
 
+  struct CodeOrderInfo {
+    CodePtr code;
+    intptr_t order;
+  };
+
+  static int CompareCodeOrderInfo(CodeOrderInfo const* a,
+                                  CodeOrderInfo const* b) {
+    if (a->order < b->order) return -1;
+    if (a->order > b->order) return 1;
+    return 0;
+  }
+
+  static void Insert(GrowableArray<CodeOrderInfo>* order_list,
+                     IntMap<intptr_t>* order_map,
+                     CodePtr code) {
+    InstructionsPtr instr = code->ptr()->instructions_;
+    intptr_t key = static_cast<intptr_t>(instr);
+    intptr_t order;
+    if (order_map->HasKey(key)) {
+      order = order_map->Lookup(key);
+    } else {
+      order = order_list->length() + 1;
+      order_map->Insert(key, order);
+    }
+    CodeOrderInfo info;
+    info.code = code;
+    info.order = order;
+    order_list->Add(info);
+  }
+
+  static void Sort(GrowableArray<CodePtr>* codes) {
+    GrowableArray<CodeOrderInfo> order_list;
+    IntMap<intptr_t> order_map;
+    for (intptr_t i = 0; i < codes->length(); i++) {
+      Insert(&order_list, &order_map, (*codes)[i]);
+    }
+    order_list.Sort(CompareCodeOrderInfo);
+    ASSERT(order_list.length() == codes->length());
+    for (intptr_t i = 0; i < order_list.length(); i++) {
+      (*codes)[i] = order_list[i].code;
+    }
+  }
+
+  static void Sort(GrowableArray<Code*>* codes) {
+    GrowableArray<CodeOrderInfo> order_list;
+    IntMap<intptr_t> order_map;
+    for (intptr_t i = 0; i < codes->length(); i++) {
+      Insert(&order_list, &order_map, (*codes)[i]->raw());
+    }
+    order_list.Sort(CompareCodeOrderInfo);
+    ASSERT(order_list.length() == codes->length());
+    for (intptr_t i = 0; i < order_list.length(); i++) {
+      *(*codes)[i] = order_list[i].code;
+    }
+  }
+
   void WriteAlloc(Serializer* s) {
+    Sort(&objects_);
+    auto loading_units = s->loading_units();
+    if (loading_units != nullptr) {
+      for (intptr_t i = LoadingUnit::kRootId + 1; i < loading_units->length();
+           i++) {
+        auto unit_objects = loading_units->At(i)->deferred_objects();
+        Sort(unit_objects);
+        for (intptr_t j = 0; j < unit_objects->length(); j++) {
+          deferred_objects_.Add(unit_objects->At(j)->raw());
+        }
+      }
+    }
+    s->PrepareInstructions(&objects_);
+
     s->WriteCid(kCodeCid);
     const intptr_t count = objects_.length();
     s->WriteUnsigned(count);
@@ -1579,6 +1650,12 @@
       CodePtr code = objects_[i];
       s->AssignRef(code);
     }
+    const intptr_t deferred_count = deferred_objects_.length();
+    s->WriteUnsigned(deferred_count);
+    for (intptr_t i = 0; i < deferred_count; i++) {
+      CodePtr code = deferred_objects_[i];
+      s->AssignRef(code);
+    }
   }
 
   void WriteFill(Serializer* s) {
@@ -1586,82 +1663,94 @@
     const intptr_t count = objects_.length();
     for (intptr_t i = 0; i < count; i++) {
       CodePtr code = objects_[i];
-      AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
-
-      intptr_t pointer_offsets_length =
-          Code::PtrOffBits::decode(code->ptr()->state_bits_);
-      if (pointer_offsets_length != 0) {
-        FATAL("Cannot serialize code with embedded pointers");
-      }
-      if (kind == Snapshot::kFullAOT && Code::IsDisabled(code)) {
-        // Disabled code is fatal in AOT since we cannot recompile.
-        s->UnexpectedObject(code, "Disabled code");
-      }
-
-      s->WriteInstructions(code->ptr()->instructions_,
-                           code->ptr()->unchecked_offset_, code, i);
-      if (kind == Snapshot::kFullJIT) {
-        // TODO(rmacnak): Fix references to disabled code before serializing.
-        // For now, we may write the FixCallersTarget or equivalent stub. This
-        // will cause a fixup if this code is called.
-        const uint32_t active_unchecked_offset =
-            code->ptr()->unchecked_entry_point_ - code->ptr()->entry_point_;
-        s->WriteInstructions(code->ptr()->active_instructions_,
-                             active_unchecked_offset, code, i);
-      }
-
-      // No need to write object pool out if we are producing full AOT
-      // snapshot with bare instructions.
-      if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
-        WriteField(code, object_pool_);
-#if defined(DART_PRECOMPILER)
-      } else if (FLAG_write_v8_snapshot_profile_to != nullptr &&
-                 code->ptr()->object_pool_ != ObjectPool::null()) {
-        // If we are writing V8 snapshot profile then attribute references
-        // going through the object pool to the code object itself.
-        ObjectPoolPtr pool = code->ptr()->object_pool_;
-
-        for (intptr_t i = 0; i < pool->ptr()->length_; i++) {
-          uint8_t bits = pool->ptr()->entry_bits()[i];
-          if (ObjectPool::TypeBits::decode(bits) ==
-              ObjectPool::EntryType::kTaggedObject) {
-            s->AttributeElementRef(pool->ptr()->data()[i].raw_obj_, i);
-          }
-        }
-#endif  // defined(DART_PRECOMPILER)
-      }
-      WriteField(code, owner_);
-      WriteField(code, exception_handlers_);
-      WriteField(code, pc_descriptors_);
-      WriteField(code, catch_entry_);
-      if (s->InCurrentLoadingUnit(code->ptr()->compressed_stackmaps_)) {
-        WriteField(code, compressed_stackmaps_);
-      } else {
-        WriteFieldValue(compressed_stackmaps_, CompressedStackMaps::null());
-      }
-      if (FLAG_precompiled_mode && FLAG_dwarf_stack_traces_mode) {
-        WriteFieldValue(inlined_id_to_function_, Array::null());
-        WriteFieldValue(code_source_map_, CodeSourceMap::null());
-      } else {
-        WriteField(code, inlined_id_to_function_);
-        if (s->InCurrentLoadingUnit(code->ptr()->code_source_map_)) {
-          WriteField(code, code_source_map_);
-        } else {
-          WriteFieldValue(code_source_map_, CodeSourceMap::null());
-        }
-      }
-      if (kind == Snapshot::kFullJIT) {
-        WriteField(code, deopt_info_array_);
-        WriteField(code, static_calls_target_table_);
-      }
-#if !defined(PRODUCT)
-      WriteField(code, return_address_metadata_);
-      if (FLAG_code_comments) {
-        WriteField(code, comments_);
-      }
-#endif
-      s->Write<int32_t>(code->ptr()->state_bits_);
+      WriteFill(s, kind, code, false);
     }
+    const intptr_t deferred_count = deferred_objects_.length();
+    for (intptr_t i = 0; i < deferred_count; i++) {
+      CodePtr code = deferred_objects_[i];
+      WriteFill(s, kind, code, true);
+    }
+  }
+
+  void WriteFill(Serializer* s,
+                 Snapshot::Kind kind,
+                 CodePtr code,
+                 bool deferred) {
+    AutoTraceObjectName(code, MakeDisambiguatedCodeName(s, code));
+
+    intptr_t pointer_offsets_length =
+        Code::PtrOffBits::decode(code->ptr()->state_bits_);
+    if (pointer_offsets_length != 0) {
+      FATAL("Cannot serialize code with embedded pointers");
+    }
+    if (kind == Snapshot::kFullAOT && Code::IsDisabled(code)) {
+      // Disabled code is fatal in AOT since we cannot recompile.
+      s->UnexpectedObject(code, "Disabled code");
+    }
+
+    s->WriteInstructions(code->ptr()->instructions_,
+                         code->ptr()->unchecked_offset_, code, deferred);
+    if (kind == Snapshot::kFullJIT) {
+      // TODO(rmacnak): Fix references to disabled code before serializing.
+      // For now, we may write the FixCallersTarget or equivalent stub. This
+      // will cause a fixup if this code is called.
+      const uint32_t active_unchecked_offset =
+          code->ptr()->unchecked_entry_point_ - code->ptr()->entry_point_;
+      s->WriteInstructions(code->ptr()->active_instructions_,
+                           active_unchecked_offset, code, deferred);
+    }
+
+    // No need to write object pool out if we are producing full AOT
+    // snapshot with bare instructions.
+    if (!(kind == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+      WriteField(code, object_pool_);
+#if defined(DART_PRECOMPILER)
+    } else if (FLAG_write_v8_snapshot_profile_to != nullptr &&
+               code->ptr()->object_pool_ != ObjectPool::null()) {
+      // If we are writing V8 snapshot profile then attribute references
+      // going through the object pool to the code object itself.
+      ObjectPoolPtr pool = code->ptr()->object_pool_;
+
+      for (intptr_t i = 0; i < pool->ptr()->length_; i++) {
+        uint8_t bits = pool->ptr()->entry_bits()[i];
+        if (ObjectPool::TypeBits::decode(bits) ==
+            ObjectPool::EntryType::kTaggedObject) {
+          s->AttributeElementRef(pool->ptr()->data()[i].raw_obj_, i);
+        }
+      }
+#endif  // defined(DART_PRECOMPILER)
+    }
+    WriteField(code, owner_);
+    WriteField(code, exception_handlers_);
+    WriteField(code, pc_descriptors_);
+    WriteField(code, catch_entry_);
+    if (s->InCurrentLoadingUnit(code->ptr()->compressed_stackmaps_)) {
+      WriteField(code, compressed_stackmaps_);
+    } else {
+      WriteFieldValue(compressed_stackmaps_, CompressedStackMaps::null());
+    }
+    if (FLAG_precompiled_mode && FLAG_dwarf_stack_traces_mode) {
+      WriteFieldValue(inlined_id_to_function_, Array::null());
+      WriteFieldValue(code_source_map_, CodeSourceMap::null());
+    } else {
+      WriteField(code, inlined_id_to_function_);
+      if (s->InCurrentLoadingUnit(code->ptr()->code_source_map_)) {
+        WriteField(code, code_source_map_);
+      } else {
+        WriteFieldValue(code_source_map_, CodeSourceMap::null());
+      }
+    }
+    if (kind == Snapshot::kFullJIT) {
+      WriteField(code, deopt_info_array_);
+      WriteField(code, static_calls_target_table_);
+    }
+#if !defined(PRODUCT)
+    WriteField(code, return_address_metadata_);
+    if (FLAG_code_comments) {
+      WriteField(code, comments_);
+    }
+#endif
+    s->Write<int32_t>(code->ptr()->state_bits_);
   }
 
   GrowableArray<CodePtr>* discovered_objects() { return &objects_; }
@@ -1699,6 +1788,7 @@
   }
 
   GrowableArray<CodePtr> objects_;
+  GrowableArray<CodePtr> deferred_objects_;
 };
 #endif  // !DART_PRECOMPILED_RUNTIME
 
@@ -1708,68 +1798,54 @@
   ~CodeDeserializationCluster() {}
 
   void ReadAlloc(Deserializer* d) {
-    start_index_ = d->next_index();
     PageSpace* old_space = d->heap()->old_space();
+    start_index_ = d->next_index();
     const intptr_t count = d->ReadUnsigned();
-
-    // Build an array of code objects representing the order in which the
-    // [Code]'s instructions will be located in memory.
-    const bool build_code_order =
-        FLAG_precompiled_mode && FLAG_use_bare_instructions;
-    ArrayPtr code_order = nullptr;
-    const intptr_t code_order_length = d->code_order_length();
-    if (build_code_order) {
-      code_order = static_cast<ArrayPtr>(AllocateUninitialized(
-          old_space, Array::InstanceSize(code_order_length)));
-      Deserializer::InitializeHeader(code_order, kArrayCid,
-                                     Array::InstanceSize(code_order_length),
-                                     /*is_canonical=*/false);
-      code_order->ptr()->type_arguments_ = TypeArguments::null();
-      code_order->ptr()->length_ = Smi::New(code_order_length);
-    }
-
     for (intptr_t i = 0; i < count; i++) {
       auto code = AllocateUninitialized(old_space, Code::InstanceSize(0));
       d->AssignRef(code);
-      if (code_order != nullptr && i < code_order_length) {
-        code_order->ptr()->data()[i] = code;
-      }
     }
-
-    if (code_order != nullptr) {
-      const auto& code_order_table = Array::Handle(code_order);
-      d->isolate()->object_store()->set_code_order_table(code_order_table);
-    }
-
     stop_index_ = d->next_index();
+    deferred_start_index_ = d->next_index();
+    const intptr_t deferred_count = d->ReadUnsigned();
+    for (intptr_t i = 0; i < deferred_count; i++) {
+      auto code = AllocateUninitialized(old_space, Code::InstanceSize(0));
+      d->AssignRef(code);
+    }
+    deferred_stop_index_ = d->next_index();
   }
 
   void ReadFill(Deserializer* d) {
     for (intptr_t id = start_index_; id < stop_index_; id++) {
-      auto const code = static_cast<CodePtr>(d->Ref(id));
-      Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
+      ReadFill(d, id, false);
+    }
+    for (intptr_t id = deferred_start_index_; id < deferred_stop_index_; id++) {
+      ReadFill(d, id, true);
+    }
+  }
 
-      d->ReadInstructions(code, id, start_index_);
+  void ReadFill(Deserializer* d, intptr_t id, bool deferred) {
+    auto const code = static_cast<CodePtr>(d->Ref(id));
+    Deserializer::InitializeHeader(code, kCodeCid, Code::InstanceSize(0));
 
-      // There would be a single global pool if this is a full AOT snapshot
-      // with bare instructions.
-      if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
-        code->ptr()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
-      } else {
-        code->ptr()->object_pool_ = ObjectPool::null();
-      }
-      code->ptr()->owner_ = d->ReadRef();
-      code->ptr()->exception_handlers_ =
-          static_cast<ExceptionHandlersPtr>(d->ReadRef());
-      code->ptr()->pc_descriptors_ =
-          static_cast<PcDescriptorsPtr>(d->ReadRef());
-      code->ptr()->catch_entry_ = d->ReadRef();
-      code->ptr()->compressed_stackmaps_ =
-          static_cast<CompressedStackMapsPtr>(d->ReadRef());
-      code->ptr()->inlined_id_to_function_ =
-          static_cast<ArrayPtr>(d->ReadRef());
-      code->ptr()->code_source_map_ =
-          static_cast<CodeSourceMapPtr>(d->ReadRef());
+    d->ReadInstructions(code, deferred);
+
+    // There would be a single global pool if this is a full AOT snapshot
+    // with bare instructions.
+    if (!(d->kind() == Snapshot::kFullAOT && FLAG_use_bare_instructions)) {
+      code->ptr()->object_pool_ = static_cast<ObjectPoolPtr>(d->ReadRef());
+    } else {
+      code->ptr()->object_pool_ = ObjectPool::null();
+    }
+    code->ptr()->owner_ = d->ReadRef();
+    code->ptr()->exception_handlers_ =
+        static_cast<ExceptionHandlersPtr>(d->ReadRef());
+    code->ptr()->pc_descriptors_ = static_cast<PcDescriptorsPtr>(d->ReadRef());
+    code->ptr()->catch_entry_ = d->ReadRef();
+    code->ptr()->compressed_stackmaps_ =
+        static_cast<CompressedStackMapsPtr>(d->ReadRef());
+    code->ptr()->inlined_id_to_function_ = static_cast<ArrayPtr>(d->ReadRef());
+    code->ptr()->code_source_map_ = static_cast<CodeSourceMapPtr>(d->ReadRef());
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
       if (d->kind() == Snapshot::kFullJIT) {
@@ -1789,16 +1865,18 @@
 #endif
 
       code->ptr()->state_bits_ = d->Read<int32_t>();
-    }
   }
 
-#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
+  void PostLoad(Deserializer* d, const Array& refs) {
+    d->EndInstructions(refs, start_index_, stop_index_);
+
 #if !defined(PRODUCT)
     if (!CodeObservers::AreActive() && !FLAG_support_disassembler) return;
 #endif
-    Code& code = Code::Handle(zone);
-    Object& owner = Object::Handle(zone);
+    Code& code = Code::Handle(d->zone());
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+    Object& owner = Object::Handle(d->zone());
+#endif
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       code ^= refs.At(id);
 #if !defined(DART_PRECOMPILED_RUNTIME) && !defined(PRODUCT)
@@ -1806,6 +1884,7 @@
         Code::NotifyCodeObservers(code, code.is_optimized());
       }
 #endif
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
       owner = code.owner();
       if (owner.IsFunction()) {
         if ((FLAG_disassemble ||
@@ -1817,9 +1896,13 @@
       } else if (FLAG_disassemble_stubs) {
         Disassembler::DisassembleStub(code.Name(), code);
       }
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
     }
   }
-#endif  // !DART_PRECOMPILED_RUNTIME
+
+ private:
+  intptr_t deferred_start_index_;
+  intptr_t deferred_stop_index_;
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -1892,13 +1975,13 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    Bytecode& bytecode = Bytecode::Handle(zone);
-    ExternalTypedData& binary = ExternalTypedData::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    Bytecode& bytecode = Bytecode::Handle(d->zone());
+    ExternalTypedData& binary = ExternalTypedData::Handle(d->zone());
 
     for (intptr_t i = start_index_; i < stop_index_; i++) {
       bytecode ^= refs.At(i);
-      binary = bytecode.GetBinary(zone);
+      binary = bytecode.GetBinary(d->zone());
       bytecode.set_instructions(reinterpret_cast<uword>(
           binary.DataAddr(bytecode.instructions_binary_offset())));
     }
@@ -2282,7 +2365,7 @@
     // rounding need to be deterministically set for reliable deduplication in
     // shared images.
     if (object->ptr()->InVMIsolateHeap() ||
-        s->isolate()->heap()->old_space()->IsObjectFromImagePages(object)) {
+        s->heap()->old_space()->IsObjectFromImagePages(object)) {
       // This object is already read-only.
     } else {
       Object::FinalizeReadOnlyObject(object);
@@ -2852,8 +2935,8 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
 #if defined(DART_PRECOMPILED_RUNTIME)
+  void PostLoad(Deserializer* d, const Array& refs) {
     if (FLAG_use_bare_instructions) {
       // By default, every megamorphic call site will load the target
       // [Function] from the hash table and call indirectly via loading the
@@ -2869,14 +2952,14 @@
       // normal switchable calls instead of megamorphic calls. (This is also a
       // memory balance beause [MegamorphicCache]s are per-selector while
       // [ICData] are per-callsite.)
-      auto& cache = MegamorphicCache::Handle(zone);
+      auto& cache = MegamorphicCache::Handle(d->zone());
       for (intptr_t i = start_index_; i < stop_index_; ++i) {
         cache ^= refs.At(i);
         cache.SwitchToBareInstructions();
       }
     }
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
   }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
 };
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -3481,11 +3564,11 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    Type& type = Type::Handle(zone);
-    Code& stub = Code::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    Type& type = Type::Handle(d->zone());
+    Code& stub = Code::Handle(d->zone());
 
-    if (Snapshot::IncludesCode(kind)) {
+    if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
            id++) {
         type ^= refs.At(id);
@@ -3587,11 +3670,11 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    TypeRef& type_ref = TypeRef::Handle(zone);
-    Code& stub = Code::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    TypeRef& type_ref = TypeRef::Handle(d->zone());
+    Code& stub = Code::Handle(d->zone());
 
-    if (Snapshot::IncludesCode(kind)) {
+    if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = start_index_; id < stop_index_; id++) {
         type_ref ^= refs.At(id);
         stub = type_ref.type_test_stub();
@@ -3713,11 +3796,11 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    TypeParameter& type_param = TypeParameter::Handle(zone);
-    Code& stub = Code::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    TypeParameter& type_param = TypeParameter::Handle(d->zone());
+    Code& stub = Code::Handle(d->zone());
 
-    if (Snapshot::IncludesCode(kind)) {
+    if (Snapshot::IncludesCode(d->kind())) {
       for (intptr_t id = canonical_start_index_; id < canonical_stop_index_;
            id++) {
         type_param ^= refs.At(id);
@@ -3901,15 +3984,15 @@
 
   void ReadFill(Deserializer* d) {}
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    const Class& mint_cls =
-        Class::Handle(zone, Isolate::Current()->object_store()->mint_class());
+  void PostLoad(Deserializer* d, const Array& refs) {
+    const Class& mint_cls = Class::Handle(
+        d->zone(), Isolate::Current()->object_store()->mint_class());
     mint_cls.set_constants(Object::empty_array());
-    Object& number = Object::Handle(zone);
+    Object& number = Object::Handle(d->zone());
     for (intptr_t i = start_index_; i < stop_index_; i++) {
       number = refs.At(i);
       if (number.IsMint() && number.IsCanonical()) {
-        mint_cls.InsertCanonicalMint(zone, Mint::Cast(number));
+        mint_cls.InsertCanonicalMint(d->zone(), Mint::Cast(number));
       }
     }
   }
@@ -4195,8 +4278,8 @@
     }
   }
 
-  void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {
-    auto& view = TypedDataView::Handle(zone);
+  void PostLoad(Deserializer* d, const Array& refs) {
+    auto& view = TypedDataView::Handle(d->zone());
     for (intptr_t id = start_index_; id < stop_index_; id++) {
       view ^= refs.At(id);
       view.RecomputeDataField();
@@ -4886,6 +4969,7 @@
       num_base_objects_(0),
       num_written_objects_(0),
       next_ref_index_(1),
+      previous_text_offset_(0),
       field_table_(thread->isolate()->field_table()),
       vm_(vm),
       profile_writer_(profile_writer)
@@ -5213,7 +5297,7 @@
   }
   if (unit_id != current_loading_unit_id_) {
     if (record) {
-      (*loading_units_)[unit_id]->AddDeferredObject(obj);
+      (*loading_units_)[unit_id]->AddDeferredObject(static_cast<CodePtr>(obj));
     }
     return false;
   }
@@ -5221,14 +5305,24 @@
 }
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+void Serializer::PrepareInstructions(GrowableArray<CodePtr>* code_objects) {
+#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+  if ((kind() == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
+    GrowableArray<ImageWriterCommand> writer_commands;
+    RelocateCodeObjects(vm_, code_objects, &writer_commands);
+    image_writer_->PrepareForSerialization(&writer_commands);
+  }
+#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
+}
+
 void Serializer::WriteInstructions(InstructionsPtr instr,
                                    uint32_t unchecked_offset,
                                    CodePtr code,
-                                   intptr_t index) {
+                                   bool deferred) {
   ASSERT(code != Code::null());
 
-  if (!InCurrentLoadingUnit(code)) {
-    Write<uint32_t>(0);
+  ASSERT(InCurrentLoadingUnit(code) != deferred);
+  if (deferred) {
     return;
   }
 
@@ -5247,33 +5341,14 @@
   }
 
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    static_assert(
-        ImageWriter::kBareInstructionsAlignment > 1,
-        "Bare instruction payloads are not aligned on even byte boundaries");
-    ASSERT((offset & 0x1) == 0);
-    // Since instructions are aligned on even byte boundaries, we can use the
-    // low bit as a flag for whether the first uint32_t read is an offset
-    // followed by the unchecked_offset + mono entry bit (when 0) or a reference
-    // to another code object (when 1).
-    if (deduped_instructions_sources_.HasKey(offset)) {
-      ASSERT(FLAG_dedup_instructions);
-      Write<uint32_t>(deduped_instructions_sources_.LookupValue(offset));
-      return;
-    }
-    Write<uint32_t>(offset);
-    // When writing only instruction payloads, we also need to serialize
-    // whether there was a single entry. We append this as the low order bit
-    // in the unchecked_offset.
-    ASSERT(Utils::IsUint(31, unchecked_offset));
+    ASSERT(offset != 0);
+    RELEASE_ASSERT(offset >= previous_text_offset_);
+    const uint32_t delta = offset - previous_text_offset_;
+    WriteUnsigned(delta);
     const uint32_t payload_info =
         (unchecked_offset << 1) | (Code::HasMonomorphicEntry(code) ? 0x1 : 0x0);
     WriteUnsigned(payload_info);
-    // Store the index with an added set low bit (e.g., the form it should take
-    // if used in serializing later Code objects). This also avoids storing a 0
-    // in the IntMap when sharing instructions with the first code object (as
-    // that is IntMap's current kNoValue).
-    ASSERT(Utils::IsUint(31, index));
-    deduped_instructions_sources_.Insert(offset, (index << 1) | 0x1);
+    previous_text_offset_ = offset;
     return;
   }
 #endif
@@ -5454,8 +5529,6 @@
     }
   }
 
-  intptr_t code_order_length = PrepareCodeOrder();
-
 #if defined(DART_PRECOMPILER)
   // Before we finalize the count of written objects, pick canonical versions
   // of WSR objects that will be serialized and then remove any non-serialized
@@ -5480,7 +5553,6 @@
   WriteUnsigned(num_base_objects_);
   WriteUnsigned(num_objects);
   WriteUnsigned(num_clusters);
-  WriteUnsigned(code_order_length);
   WriteUnsigned(field_table_->NumFieldIds());
 
   for (intptr_t cid = 1; cid < num_cids_; cid++) {
@@ -5522,48 +5594,6 @@
     }
   }
 }
-
-intptr_t Serializer::PrepareCodeOrder() {
-  intptr_t code_order_length = 0;
-#if defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  if ((kind_ == Snapshot::kFullAOT) && FLAG_use_bare_instructions) {
-    auto code_objects =
-        static_cast<CodeSerializationCluster*>(clusters_by_cid_[kCodeCid])
-            ->discovered_objects();
-
-    GrowableArray<ImageWriterCommand> writer_commands;
-    RelocateCodeObjects(vm_, code_objects, &writer_commands);
-    image_writer_->PrepareForSerialization(&writer_commands);
-
-    // We permute the code objects in the x[CodeSerializationCluster] so they
-    // will arrive in the order in which the [Code]'s instructions will be in
-    // memory at AOT runtime.
-    GrowableArray<CodePtr> code_order;
-    RawCodeSet code_set;
-    for (auto& command : writer_commands) {
-      if (command.op == ImageWriterCommand::InsertInstructionOfCode) {
-        CodePtr code = command.insert_instruction_of_code.code;
-        ASSERT(!code_set.HasKey(code));
-        code_set.Insert(code);
-        code_order.Add(code);
-        code_order_length++;
-      }
-    }
-    for (CodePtr code : *code_objects) {
-      if (!code_set.HasKey(code)) {
-        code_set.Insert(code);
-        code_order.Add(code);
-      }
-    }
-    RELEASE_ASSERT(code_order.length() == code_objects->length());
-    for (intptr_t i = 0; i < code_objects->length(); ++i) {
-      (*code_objects)[i] = code_order[i];
-    }
-  }
-#endif  // defined(DART_PRECOMPILER) && !defined(TARGET_ARCH_IA32)
-  return code_order_length;
-}
-
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
 #if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
@@ -5978,17 +6008,30 @@
     Push(code->ptr()->compressed_stackmaps_);
     Push(code->ptr()->code_source_map_);
   }
+  {
+    GrowableArray<CodePtr> raw_codes(num_deferred_objects);
+    for (intptr_t i = 0; i < num_deferred_objects; i++) {
+      raw_codes.Add((*unit->deferred_objects())[i]->raw());
+    }
+    PrepareInstructions(&raw_codes);
+  }
 
   Serialize();
 
-  Write(num_deferred_objects);
+  intptr_t start_index = 0;
+  if (num_deferred_objects != 0) {
+    start_index = RefId(unit->deferred_objects()->At(0)->raw());
+    ASSERT(start_index > 0);
+  }
+  WriteUnsigned(start_index);
+  WriteUnsigned(num_deferred_objects);
   for (intptr_t i = 0; i < num_deferred_objects; i++) {
     const Object* deferred_object = (*unit->deferred_objects())[i];
     ASSERT(deferred_object->IsCode());
     CodePtr code = static_cast<CodePtr>(deferred_object->raw());
-    WriteRootRef(code, "deferred-code");
+    ASSERT(RefId(code) == (start_index + i));
     WriteInstructions(code->ptr()->instructions_,
-                      code->ptr()->unchecked_offset_, code, -1);
+                      code->ptr()->unchecked_offset_, code, false);
     WriteRootRef(code->ptr()->compressed_stackmaps_, "deferred-code");
     WriteRootRef(code->ptr()->code_source_map_, "deferred-code");
   }
@@ -6017,6 +6060,7 @@
       image_reader_(NULL),
       refs_(nullptr),
       next_ref_index_(1),
+      previous_text_offset_(0),
       clusters_(NULL),
       field_table_(thread->isolate()->field_table()) {
   if (Snapshot::IncludesCode(kind)) {
@@ -6329,34 +6373,38 @@
   return ApiError::New(msg, Heap::kOld);
 }
 
-void Deserializer::ReadInstructions(CodePtr code,
-                                    intptr_t index,
-                                    intptr_t start_index) {
+void Deserializer::ReadInstructions(CodePtr code, bool deferred) {
+  if (deferred) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    if (FLAG_use_bare_instructions) {
+      uword entry_point = StubCode::NotLoaded().EntryPoint();
+      code->ptr()->entry_point_ = entry_point;
+      code->ptr()->unchecked_entry_point_ = entry_point;
+      code->ptr()->monomorphic_entry_point_ = entry_point;
+      code->ptr()->monomorphic_unchecked_entry_point_ = entry_point;
+      code->ptr()->instructions_length_ = 0;
+      return;
+    }
+#endif
+    InstructionsPtr instr = StubCode::NotLoaded().instructions();
+    uint32_t unchecked_offset = 0;
+    code->ptr()->instructions_ = instr;
+#if defined(DART_PRECOMPILED_RUNTIME)
+    code->ptr()->instructions_length_ = Instructions::Size(instr);
+#else
+    code->ptr()->unchecked_offset_ = unchecked_offset;
+#endif
+    Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
+    return;
+  }
+
 #if defined(DART_PRECOMPILED_RUNTIME)
   if (FLAG_use_bare_instructions) {
     // There are no serialized RawInstructions objects in this mode.
     code->ptr()->instructions_ = Instructions::null();
-
-    const uint32_t bare_offset = Read<uint32_t>();
-    if ((bare_offset & 0x1) == 0x1) {
-      // The low bit being set marks this as a reference to an earlier Code
-      // object in the cluster that shared the same deduplicated Instructions
-      // object. Thus, retrieve the instructions-related information from there.
-      ASSERT((index - start_index) >= code_order_length());
-      const uint32_t source_id = (bare_offset >> 1) + start_index;
-      auto const source = static_cast<CodePtr>(Ref(source_id));
-      code->ptr()->entry_point_ = source->ptr()->entry_point_;
-      code->ptr()->unchecked_entry_point_ =
-          source->ptr()->unchecked_entry_point_;
-      code->ptr()->monomorphic_entry_point_ =
-          source->ptr()->monomorphic_entry_point_;
-      code->ptr()->monomorphic_unchecked_entry_point_ =
-          source->ptr()->monomorphic_unchecked_entry_point_;
-      code->ptr()->instructions_length_ = source->ptr()->instructions_length_;
-      return;
-    }
+    previous_text_offset_ += ReadUnsigned();
     const uword payload_start =
-        image_reader_->GetBareInstructionsAt(bare_offset);
+        image_reader_->GetBareInstructionsAt(previous_text_offset_);
     const uint32_t payload_info = ReadUnsigned();
     const uint32_t unchecked_offset = payload_info >> 1;
     const bool has_monomorphic_entrypoint = (payload_info & 0x1) == 0x1;
@@ -6377,42 +6425,12 @@
     code->ptr()->monomorphic_entry_point_ = monomorphic_entry_point;
     code->ptr()->monomorphic_unchecked_entry_point_ =
         monomorphic_entry_point + unchecked_offset;
-
-    // We don't serialize the length of the instructions payload. Instead, we
-    // calculate an approximate length (may include padding) by subtracting the
-    // payload start of the next Code object (if any) from the start for this
-    // one. Thus, here we patch the instructions length for the previous Code
-    // object, if any.
-    ASSERT((index - start_index) < code_order_length());
-    const uword curr_payload_start = Code::PayloadStartOf(code);
-    if (index > start_index) {
-      auto const prev = static_cast<CodePtr>(Ref(index - 1));
-      const uword prev_payload_start = Code::PayloadStartOf(prev);
-      prev->ptr()->instructions_length_ =
-          curr_payload_start - prev_payload_start;
-    }
-    // For the last Code object whose Instructions were written to the
-    // instructions image, assume its payload extends to the image's end.
-    if ((index - start_index) == code_order_length() - 1) {
-      code->ptr()->instructions_length_ =
-          image_reader_->GetBareInstructionsEnd() - curr_payload_start;
-    }
-
     return;
   }
 #endif
 
-  const uint32_t offset = Read<uint32_t>();
-  InstructionsPtr instr;
-  uint32_t unchecked_offset;
-  if (offset == 0) {
-    instr = StubCode::NotLoaded().instructions();
-    unchecked_offset = 0;
-  } else {
-    instr = image_reader_->GetInstructionsAt(offset);
-    unchecked_offset = ReadUnsigned();
-  }
-
+  InstructionsPtr instr = image_reader_->GetInstructionsAt(Read<uint32_t>());
+  uint32_t unchecked_offset = ReadUnsigned();
   code->ptr()->instructions_ = instr;
 #if defined(DART_PRECOMPILED_RUNTIME)
   code->ptr()->instructions_length_ = Instructions::Size(instr);
@@ -6428,6 +6446,42 @@
   Code::InitializeCachedEntryPointsFrom(code, instr, unchecked_offset);
 }
 
+void Deserializer::EndInstructions(const Array& refs,
+                                   intptr_t start_index,
+                                   intptr_t stop_index) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_use_bare_instructions) {
+    uword previous_end = image_reader_->GetBareInstructionsEnd();
+    for (intptr_t id = stop_index - 1; id >= start_index; id--) {
+      CodePtr code = static_cast<CodePtr>(refs.At(id));
+      uword start = Code::PayloadStartOf(code);
+      ASSERT(start <= previous_end);
+      code->ptr()->instructions_length_ = previous_end - start;
+      previous_end = start;
+    }
+
+    // Build an array of code objects representing the order in which the
+    // [Code]'s instructions will be located in memory.
+    const intptr_t count = stop_index - start_index;
+    const Array& order_table =
+        Array::Handle(zone_, Array::New(count, Heap::kOld));
+    Object& code = Object::Handle(zone_);
+    for (intptr_t i = 0; i < count; i++) {
+      code = refs.At(start_index + i);
+      order_table.SetAt(i, code);
+    }
+    ObjectStore* object_store = Isolate::Current()->object_store();
+    GrowableObjectArray& order_tables =
+        GrowableObjectArray::Handle(zone_, object_store->code_order_tables());
+    if (order_tables.IsNull()) {
+      order_tables = GrowableObjectArray::New(Heap::kOld);
+      object_store->set_code_order_tables(order_tables);
+    }
+    order_tables.Add(order_table, Heap::kOld);
+  }
+#endif
+}
+
 ObjectPtr Deserializer::GetObjectAt(uint32_t offset) const {
   return image_reader_->GetObjectAt(offset);
 }
@@ -6436,7 +6490,6 @@
   num_base_objects_ = ReadUnsigned();
   num_objects_ = ReadUnsigned();
   num_clusters_ = ReadUnsigned();
-  code_order_length_ = ReadUnsigned();
   const intptr_t field_table_len = ReadUnsigned();
 
   clusters_ = new DeserializationCluster*[num_clusters_];
@@ -6593,12 +6646,12 @@
 #endif
 
   for (intptr_t i = 0; i < num_clusters_; i++) {
-    clusters_[i]->PostLoad(refs, kind_, zone_);
+    clusters_[i]->PostLoad(this, refs);
   }
 }
 
 void Deserializer::ReadProgramSnapshot(ObjectStore* object_store) {
-  Array& refs = Array::Handle();
+  Array& refs = Array::Handle(zone_);
   Prepare();
 
   {
@@ -6642,11 +6695,12 @@
 #endif
 
   for (intptr_t i = 0; i < num_clusters_; i++) {
-    clusters_[i]->PostLoad(refs, kind_, zone_);
+    clusters_[i]->PostLoad(this, refs);
   }
-  const Array& units = Array::Handle(isolate->object_store()->loading_units());
+  const Array& units =
+      Array::Handle(zone_, isolate->object_store()->loading_units());
   if (!units.IsNull()) {
-    LoadingUnit& unit = LoadingUnit::Handle();
+    LoadingUnit& unit = LoadingUnit::Handle(zone_);
     unit ^= units.At(LoadingUnit::kRootId);
     unit.set_base_objects(refs);
   }
@@ -6657,8 +6711,8 @@
 }
 
 ApiErrorPtr Deserializer::ReadUnitSnapshot(const LoadingUnit& unit) {
-  Array& units =
-      Array::Handle(thread()->isolate()->object_store()->loading_units());
+  Array& units = Array::Handle(
+      zone_, thread()->isolate()->object_store()->loading_units());
   uint32_t main_program_hash = Smi::Value(Smi::RawCast(units.At(0)));
   uint32_t unit_program_hash = Read<uint32_t>();
   if (main_program_hash != unit_program_hash) {
@@ -6667,26 +6721,29 @@
                                    "program than the main loading unit")));
   }
 
-  Array& refs = Array::Handle();
+  Array& refs = Array::Handle(zone_);
   Prepare();
 
+  intptr_t deferred_start_index;
+  intptr_t deferred_stop_index;
   {
     NoSafepointScope no_safepoint;
     HeapLocker hl(thread(), heap_->old_space());
 
     // N.B.: Skipping index 0 because ref 0 is illegal.
-    const Array& base_objects =
-        Array::Handle(LoadingUnit::Handle(unit.parent()).base_objects());
+    const Array& base_objects = Array::Handle(
+        zone_, LoadingUnit::Handle(zone_, unit.parent()).base_objects());
     for (intptr_t i = 1; i < base_objects.Length(); i++) {
       AddBaseObject(base_objects.At(i));
     }
 
     Deserialize();
 
-    intptr_t num_deferred = Read<intptr_t>();
-    for (intptr_t i = 0; i < num_deferred; i++) {
-      CodePtr code = static_cast<CodePtr>(ReadRef());
-      ReadInstructions(code, -1, -1);
+    deferred_start_index = ReadUnsigned();
+    deferred_stop_index = deferred_start_index + ReadUnsigned();
+    for (intptr_t id = deferred_start_index; id < deferred_stop_index; id++) {
+      CodePtr code = static_cast<CodePtr>(Ref(id));
+      ReadInstructions(code, false);
       if (code->ptr()->owner_->IsFunction()) {
         FunctionPtr func = static_cast<FunctionPtr>(code->ptr()->owner_);
         uword entry_point = code->ptr()->entry_point_;
@@ -6716,8 +6773,9 @@
   isolate->heap()->Verify();
 #endif
 
+  EndInstructions(refs, deferred_start_index, deferred_stop_index);
   for (intptr_t i = 0; i < num_clusters_; i++) {
-    clusters_[i]->PostLoad(refs, kind_, zone_);
+    clusters_[i]->PostLoad(this, refs);
   }
   unit.set_base_objects(refs);
 
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index 252be23..4710372 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -60,17 +60,15 @@
   LoadingUnitSerializationData* parent() const { return parent_; }
   intptr_t num_objects() const { return num_objects_; }
   void set_num_objects(intptr_t value) { num_objects_ = value; }
-  void AddDeferredObject(ObjectPtr obj) {
-    deferred_objects_.Add(&Object::ZoneHandle(obj));
+  void AddDeferredObject(CodePtr obj) {
+    deferred_objects_.Add(&Code::ZoneHandle(obj));
   }
-  GrowableArray<const Object*>* deferred_objects() {
-    return &deferred_objects_;
-  }
+  GrowableArray<Code*>* deferred_objects() { return &deferred_objects_; }
 
  private:
   intptr_t id_;
   LoadingUnitSerializationData* parent_;
-  GrowableArray<const Object*> deferred_objects_;
+  GrowableArray<Code*> deferred_objects_;
   intptr_t num_objects_;
 };
 
@@ -118,7 +116,7 @@
 
   // Complete any action that requires the full graph to be deserialized, such
   // as rehashing.
-  virtual void PostLoad(const Array& refs, Snapshot::Kind kind, Zone* zone) {}
+  virtual void PostLoad(Deserializer* deserializer, const Array& refs) {}
 
  protected:
   // The range of the ref array that belongs to this cluster.
@@ -403,17 +401,19 @@
     Write<int32_t>(cid);
   }
 
+  void PrepareInstructions(GrowableArray<CodePtr>* codes);
   void WriteInstructions(InstructionsPtr instr,
                          uint32_t unchecked_offset,
                          CodePtr code,
-                         intptr_t index);
+                         bool deferred);
   uint32_t GetDataOffset(ObjectPtr object) const;
   void TraceDataOffset(uint32_t offset);
   intptr_t GetDataSize() const;
 
-  intptr_t PrepareCodeOrder();
   void WriteDispatchTable(const Array& entries);
 
+  Heap* heap() const { return heap_; }
+  Zone* zone() const { return zone_; }
   Snapshot::Kind kind() const { return kind_; }
   intptr_t next_ref_index() const { return next_ref_index_; }
 
@@ -428,6 +428,9 @@
   bool CreateArtificalNodeIfNeeded(ObjectPtr obj);
 
   bool InCurrentLoadingUnit(ObjectPtr obj, bool record = false);
+  GrowableArray<LoadingUnitSerializationData*>* loading_units() {
+    return loading_units_;
+  }
   void set_loading_units(GrowableArray<LoadingUnitSerializationData*>* units) {
     loading_units_ = units;
   }
@@ -491,6 +494,7 @@
   intptr_t num_base_objects_;
   intptr_t num_written_objects_;
   intptr_t next_ref_index_;
+  intptr_t previous_text_offset_;
   SmiObjectIdMap smi_ids_;
   FieldTable* field_table_;
 
@@ -687,7 +691,10 @@
     return Read<int32_t>();
   }
 
-  void ReadInstructions(CodePtr code, intptr_t index, intptr_t start_index);
+  void ReadInstructions(CodePtr code, bool deferred);
+  void EndInstructions(const Array& refs,
+                       intptr_t start_index,
+                       intptr_t stop_index);
   ObjectPtr GetObjectAt(uint32_t offset) const;
 
   void SkipHeader() { stream_.SetPosition(Snapshot::kHeaderSize); }
@@ -701,24 +708,10 @@
 
   intptr_t next_index() const { return next_ref_index_; }
   Heap* heap() const { return heap_; }
+  Zone* zone() const { return zone_; }
   Snapshot::Kind kind() const { return kind_; }
   FieldTable* field_table() const { return field_table_; }
 
-  // The number of code objects which were relocated during AOT snapshot
-  // writing.
-  //
-  // After relocating the instructions in the ".text" segment, the
-  // [CodeSerializationCluster] will re-order those code objects that get
-  // written out in the cluster.  The order will be dictated by the order of
-  // the code's instructions in the ".text" segment.
-  //
-  // The [code_order_length] represents therefore the prefix of code objects in
-  // the written out code cluster. (There might be code objects for which no
-  // relocation was performed.)
-  //
-  // This will be used to construct [ObjectStore::code_order_table].
-  intptr_t code_order_length() const { return code_order_length_; }
-
  private:
   Heap* heap_;
   Zone* zone_;
@@ -728,9 +721,9 @@
   intptr_t num_base_objects_;
   intptr_t num_objects_;
   intptr_t num_clusters_;
-  intptr_t code_order_length_ = 0;
   ArrayPtr refs_;
   intptr_t next_ref_index_;
+  intptr_t previous_text_offset_;
   DeserializationCluster** clusters_;
   FieldTable* field_table_;
 };
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index d9062a4..0077394 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -397,13 +397,13 @@
 
   CodePtr target() const {
     const uword pc = object_pool_.RawValueAt(target_index());
-    auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
-    if (rct->Contains(pc)) {
-      return rct->Lookup(pc);
+    CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+    if (result != Code::null()) {
+      return result;
     }
-    rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
-    if (rct->Contains(pc)) {
-      return rct->Lookup(pc);
+    result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+    if (result != Code::null()) {
+      return result;
     }
     UNREACHABLE();
   }
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index 7d81c2b..f4bacaf 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2838,6 +2838,53 @@
   return;
 }
 
+// The assignment to loading units here must match that in
+// AssignLoadingUnitsCodeVisitor, which runs after compilation is done.
+static intptr_t LoadingUnitOf(Zone* zone, const Function& function) {
+  const Class& cls = Class::Handle(zone, function.Owner());
+  const Library& lib = Library::Handle(zone, cls.library());
+  const LoadingUnit& unit = LoadingUnit::Handle(zone, lib.loading_unit());
+  ASSERT(!unit.IsNull());
+  return unit.id();
+}
+
+static intptr_t LoadingUnitOf(Zone* zone, const Code& code) {
+  // No WeakSerializationReference owners here because those are only
+  // introduced during AOT serialization.
+  if (code.IsStubCode() || code.IsTypeTestStubCode()) {
+    return LoadingUnit::kRootId;
+  } else if (code.IsAllocationStubCode()) {
+    const Class& cls = Class::Cast(Object::Handle(zone, code.owner()));
+    const Library& lib = Library::Handle(zone, cls.library());
+    const LoadingUnit& unit = LoadingUnit::Handle(zone, lib.loading_unit());
+    ASSERT(!unit.IsNull());
+    return unit.id();
+  } else if (code.IsFunctionCode()) {
+    return LoadingUnitOf(zone,
+                         Function::Cast(Object::Handle(zone, code.owner())));
+  } else {
+    UNREACHABLE();
+    return LoadingUnit::kIllegalId;
+  }
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const Function& target) const {
+  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+         (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const Code& target) const {
+  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+         !target.InVMIsolateHeap() &&
+         (LoadingUnitOf(zone_, function()) == LoadingUnitOf(zone_, target));
+}
+
+bool FlowGraphCompiler::CanPcRelativeCall(const AbstractType& target) const {
+  return FLAG_precompiled_mode && FLAG_use_bare_instructions &&
+         !target.InVMIsolateHeap() &&
+         (LoadingUnitOf(zone_, function()) == LoadingUnit::kRootId);
+}
+
 #undef __
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index 9efcd30..47e9530 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -1141,6 +1141,10 @@
   bool CanCallDart() const { return true; }
 #endif
 
+  bool CanPcRelativeCall(const Function& target) const;
+  bool CanPcRelativeCall(const Code& target) const;
+  bool CanPcRelativeCall(const AbstractType& target) const;
+
   // This struct contains either function or code, the other one being NULL.
   class StaticCallsStruct : public ZoneAllocated {
    public:
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index 65cba11..bfc9b81 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -35,7 +35,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_write_barrier_wrapper_ =
           [&](Condition condition, Register reg) {
             const intptr_t offset_into_target =
@@ -48,7 +48,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_array_write_barrier_ =
           [&](Condition condition) {
             assembler_->GenerateUnRelocatedPcRelativeCall(condition);
@@ -779,9 +779,8 @@
 
   // If the dst_type is instantiated we know the target TTS stub at
   // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call = dst_type.IsInstantiated() &&
-                                    FLAG_precompiled_mode &&
-                                    FLAG_use_bare_instructions;
+  const bool use_pc_relative_call =
+      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
 
   const Register kRegToCall =
       use_pc_relative_call
@@ -975,8 +974,7 @@
 
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallStubTarget(stub);
   } else {
@@ -987,8 +985,7 @@
 
 void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ LeaveDartFrame();
     __ GenerateUnRelocatedPcRelativeTailCall();
     AddPcRelativeTailCallStubTarget(stub);
@@ -1030,7 +1027,7 @@
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
     EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 131308c..b235c33 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -34,7 +34,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
         const intptr_t offset_into_target =
             Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -45,7 +45,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_array_write_barrier_ = [&]() {
         assembler_->GenerateUnRelocatedPcRelativeCall();
         AddPcRelativeCallStubTarget(array_stub);
@@ -745,9 +745,8 @@
 
   // If the dst_type is instantiated we know the target TTS stub at
   // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call = dst_type.IsInstantiated() &&
-                                    FLAG_precompiled_mode &&
-                                    FLAG_use_bare_instructions;
+  const bool use_pc_relative_call =
+      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
 
   const Register kRegToCall =
       use_pc_relative_call
@@ -940,8 +939,7 @@
 
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallStubTarget(stub);
   } else {
@@ -952,8 +950,7 @@
 
 void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ LeaveDartFrame();
     __ GenerateUnRelocatedPcRelativeTailCall();
     AddPcRelativeTailCallStubTarget(stub);
@@ -996,7 +993,7 @@
                                                const Function& target,
                                                Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
     EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index cf229f3..4b4e217 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -34,7 +34,7 @@
 
     const auto& stub =
         Code::ZoneHandle(object_store->write_barrier_wrappers_stub());
-    if (!stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
         const intptr_t offset_into_target =
             Thread::WriteBarrierWrappersOffsetForRegister(reg);
@@ -45,7 +45,7 @@
 
     const auto& array_stub =
         Code::ZoneHandle(object_store->array_write_barrier_stub());
-    if (!array_stub.InVMIsolateHeap()) {
+    if (CanPcRelativeCall(stub)) {
       assembler_->generate_invoke_array_write_barrier_ = [&]() {
         assembler_->GenerateUnRelocatedPcRelativeCall();
         AddPcRelativeCallStubTarget(array_stub);
@@ -752,9 +752,8 @@
 
   // If the dst_type is instantiated we know the target TTS stub at
   // compile-time and can therefore use a pc-relative call.
-  const bool use_pc_relative_call = dst_type.IsInstantiated() &&
-                                    FLAG_precompiled_mode &&
-                                    FLAG_use_bare_instructions;
+  const bool use_pc_relative_call =
+      dst_type.IsInstantiated() && CanPcRelativeCall(dst_type);
   const Register kScratchReg =
       dst_type.IsTypeParameter() ? RSI : TypeTestABI::kDstTypeReg;
 
@@ -944,8 +943,7 @@
 
 void FlowGraphCompiler::EmitCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallStubTarget(stub);
   } else {
@@ -956,8 +954,7 @@
 
 void FlowGraphCompiler::EmitTailCallToStub(const Code& stub) {
   ASSERT(!stub.IsNull());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      !stub.InVMIsolateHeap()) {
+  if (CanPcRelativeCall(stub)) {
     __ LeaveDartFrame();
     __ GenerateUnRelocatedPcRelativeTailCall();
     AddPcRelativeTailCallStubTarget(stub);
@@ -1000,7 +997,7 @@
                                                Code::EntryKind entry_kind) {
   ASSERT(CanCallDart());
   ASSERT(is_optimizing());
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+  if (CanPcRelativeCall(target)) {
     __ GenerateUnRelocatedPcRelativeCall();
     AddPcRelativeCallTarget(target, entry_kind);
     EmitCallsiteMetadata(token_pos, deopt_id, kind, locs);
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 2607860..9a09341 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -3773,8 +3773,7 @@
           ? object_store->stack_overflow_stub_with_fpu_regs_stub()
           : object_store->stack_overflow_stub_without_fpu_regs_stub());
   const bool using_shared_stub = locs()->call_on_shared_slow_path();
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      using_shared_stub && !stub.InVMIsolateHeap()) {
+  if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
     __ GenerateUnRelocatedPcRelativeCall(LS);
     compiler->AddPcRelativeCallStubTarget(stub);
 
@@ -6576,8 +6575,7 @@
       NullErrorSlowPath::GetStub(compiler, exception_type(), live_fpu_regs));
   const bool using_shared_stub = locs()->call_on_shared_slow_path();
 
-  if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-      using_shared_stub && !stub.InVMIsolateHeap()) {
+  if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
     __ GenerateUnRelocatedPcRelativeCall(EQUAL);
     compiler->AddPcRelativeCallStubTarget(stub);
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 3102576..2a9d946 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -3232,8 +3232,7 @@
               ? object_store->stack_overflow_stub_with_fpu_regs_stub()
               : object_store->stack_overflow_stub_without_fpu_regs_stub());
 
-      if (FLAG_precompiled_mode && FLAG_use_bare_instructions &&
-          using_shared_stub && !stub.InVMIsolateHeap()) {
+      if (using_shared_stub && compiler->CanPcRelativeCall(stub)) {
         __ GenerateUnRelocatedPcRelativeCall();
         compiler->AddPcRelativeCallStubTarget(stub);
       } else {
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index deb8784..38ac210 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -2121,7 +2121,9 @@
       !target::Class::TraceAllocation(cls) &&
       target::SizeFitsInSizeTag(instance_size)) {
     if (is_cls_parameterized) {
-      if (!IsSameObject(NullObject(),
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(),
                         CastHandle<Object>(allocat_object_parametrized))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2133,7 +2135,9 @@
                            allocate_object_parameterized_entry_point_offset()));
       }
     } else {
-      if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
             __ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index db103f75..afc9b10 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -2266,7 +2266,9 @@
       !target::Class::TraceAllocation(cls) &&
       target::SizeFitsInSizeTag(instance_size)) {
     if (is_cls_parameterized) {
-      if (!IsSameObject(NullObject(),
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(),
                         CastHandle<Object>(allocat_object_parametrized))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2279,7 +2281,9 @@
         __ br(R4);
       }
     } else {
-      if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
             __ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index a4a6045..e6566c3 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -2199,7 +2199,9 @@
       !target::Class::TraceAllocation(cls) &&
       target::SizeFitsInSizeTag(instance_size)) {
     if (is_cls_parameterized) {
-      if (!IsSameObject(NullObject(),
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(),
                         CastHandle<Object>(allocat_object_parametrized))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
@@ -2210,7 +2212,9 @@
                            allocate_object_parameterized_entry_point_offset()));
       }
     } else {
-      if (!IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
+      // TODO(41974): Assign all allocation stubs to the root loading unit?
+      if (false &&
+          !IsSameObject(NullObject(), CastHandle<Object>(allocate_object))) {
         __ GenerateUnRelocatedPcRelativeTailCall();
         unresolved_calls->Add(new UnresolvedPcRelativeCall(
             __ CodeSize(), allocate_object, /*is_tail_call=*/true));
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e419af5..0ffe978 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -335,8 +335,6 @@
         return Utils::StrDup(error.ToErrorCString());
       }
 
-      ReversePcLookupCache::BuildAndAttachToIsolateGroup(vm_isolate_->group());
-
       Object::FinishInit(vm_isolate_);
 #if defined(SUPPORT_TIMELINE)
       if (tbes.enabled()) {
@@ -735,7 +733,6 @@
       return error.raw();
     }
 
-    ReversePcLookupCache::BuildAndAttachToIsolateGroup(I->group());
     I->group()->set_saved_initial_field_table(
         std::shared_ptr<FieldTable>(I->field_table()->Clone()));
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index f190dcc..a9dfc83 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1887,6 +1887,17 @@
   return Api::NewHandle(T, I->sticky_error());
 }
 
+DART_EXPORT void Dart_HintFreed(intptr_t size) {
+  if (size < 0) {
+    FATAL1("%s requires a non-negative size", CURRENT_FUNC);
+  }
+  Thread* T = Thread::Current();
+  CHECK_ISOLATE(T->isolate());
+  API_TIMELINE_BEGIN_END(T);
+  TransitionNativeToVM transition(T);
+  T->heap()->HintFreed(size);
+}
+
 DART_EXPORT void Dart_NotifyIdle(int64_t deadline) {
   Thread* T = Thread::Current();
   CHECK_ISOLATE(T->isolate());
@@ -6788,9 +6799,9 @@
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
 #else
-  if (FLAG_use_bare_instructions) {
+  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
     return Api::NewError(
-        "Splitting is not compatible with --use_bare_instructions.");
+        "Splitting is not compatible with --use_table_dispatch.");
   }
 
   DARTSCOPE(Thread::Current());
@@ -6870,9 +6881,9 @@
   return Api::NewError(
       "This VM was built without support for AOT compilation.");
 #else
-  if (FLAG_use_bare_instructions) {
+  if (FLAG_use_bare_instructions && FLAG_use_table_dispatch) {
     return Api::NewError(
-        "Splitting is not compatible with --use_bare_instructions.");
+        "Splitting is not compatible with --use_table_dispatch.");
   }
 
   DARTSCOPE(Thread::Current());
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 84681a8..2c2a4eb 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -8768,7 +8768,39 @@
   EXPECT_SUBSTRING("testAsyncEvent", js.ToCString());
 }
 
-void NotifyIdleShortNative(Dart_NativeArguments args) {
+static void HintFreedNative(Dart_NativeArguments args) {
+  int64_t size = 0;
+  EXPECT_VALID(Dart_GetNativeIntegerArgument(args, 0, &size));
+  Dart_HintFreed(size);
+}
+
+static Dart_NativeFunction HintFreed_native_lookup(Dart_Handle name,
+                                                   int argument_count,
+                                                   bool* auto_setup_scope) {
+  return HintFreedNative;
+}
+
+TEST_CASE(DartAPI_HintFreed) {
+  const char* kScriptChars =
+      "void hintFreed(int size) native 'Test_nativeFunc';\n"
+      "void main() {\n"
+      "  var v;\n"
+      "  for (var i = 0; i < 100; i++) {\n"
+      "    var t = [];\n"
+      "    for (var j = 0; j < 10000; j++) {\n"
+      "      t.add(List.filled(100, null));\n"
+      "    }\n"
+      "    v = t;\n"
+      "    hintFreed(100 * 10000 * 4);\n"
+      "  }\n"
+      "}\n";
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, &HintFreed_native_lookup);
+  Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+static void NotifyIdleShortNative(Dart_NativeArguments args) {
   Dart_NotifyIdle(Dart_TimelineGetMicros() + 10 * kMicrosecondsPerMillisecond);
 }
 
@@ -8776,7 +8808,7 @@
     Dart_Handle name,
     int argument_count,
     bool* auto_setup_scope) {
-  return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleShortNative);
+  return NotifyIdleShortNative;
 }
 
 TEST_CASE(DartAPI_NotifyIdleShort) {
@@ -8799,7 +8831,7 @@
   EXPECT_VALID(result);
 }
 
-void NotifyIdleLongNative(Dart_NativeArguments args) {
+static void NotifyIdleLongNative(Dart_NativeArguments args) {
   Dart_NotifyIdle(Dart_TimelineGetMicros() + 100 * kMicrosecondsPerMillisecond);
 }
 
@@ -8807,7 +8839,7 @@
     Dart_Handle name,
     int argument_count,
     bool* auto_setup_scope) {
-  return reinterpret_cast<Dart_NativeFunction>(&NotifyIdleLongNative);
+  return NotifyIdleLongNative;
 }
 
 TEST_CASE(DartAPI_NotifyIdleLong) {
@@ -8830,7 +8862,7 @@
   EXPECT_VALID(result);
 }
 
-void NotifyLowMemoryNative(Dart_NativeArguments args) {
+static void NotifyLowMemoryNative(Dart_NativeArguments args) {
   Dart_NotifyLowMemory();
 }
 
@@ -8838,7 +8870,7 @@
     Dart_Handle name,
     int argument_count,
     bool* auto_setup_scope) {
-  return reinterpret_cast<Dart_NativeFunction>(&NotifyLowMemoryNative);
+  return NotifyLowMemoryNative;
 }
 
 TEST_CASE(DartAPI_NotifyLowMemory) {
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 8c89691..7e81415 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -405,6 +405,10 @@
   ml.NotifyAll();
 }
 
+void Heap::HintFreed(intptr_t size) {
+  old_space_.HintFreed(size);
+}
+
 void Heap::NotifyIdle(int64_t deadline) {
   Thread* thread = Thread::Current();
   // Check if we want to collect new-space first, because if we want to collect
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index bb6652e..fa9d733 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -121,6 +121,7 @@
   ObjectPtr FindNewObject(FindObjectVisitor* visitor);
   ObjectPtr FindObject(FindObjectVisitor* visitor);
 
+  void HintFreed(intptr_t size);
   void NotifyIdle(int64_t deadline);
   void NotifyLowMemory();
 
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index b2f4ae4..c0a2597 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -1709,6 +1709,17 @@
   }
 }
 
+void PageSpaceController::HintFreed(intptr_t size) {
+  intptr_t size_in_words = size << kWordSizeLog2;
+  if (size_in_words > idle_gc_threshold_in_words_) {
+    idle_gc_threshold_in_words_ = 0;
+  } else {
+    idle_gc_threshold_in_words_ -= size_in_words;
+  }
+
+  // TODO(rmacnak): Hasten the soft threshold at some discount?
+}
+
 void PageSpaceController::MergeFrom(PageSpaceController* donor) {
   last_usage_.capacity_in_words += donor->last_usage_.capacity_in_words;
   last_usage_.used_in_words += donor->last_usage_.used_in_words;
diff --git a/runtime/vm/heap/pages.h b/runtime/vm/heap/pages.h
index a493190..ef5badf 100644
--- a/runtime/vm/heap/pages.h
+++ b/runtime/vm/heap/pages.h
@@ -228,6 +228,7 @@
                                  int64_t start,
                                  int64_t end);
   void EvaluateAfterLoading(SpaceUsage after);
+  void HintFreed(intptr_t size);
 
   void set_last_usage(SpaceUsage current) { last_usage_ = current; }
 
@@ -318,6 +319,7 @@
   void EvaluateAfterLoading() {
     page_space_controller_.EvaluateAfterLoading(usage_);
   }
+  void HintFreed(intptr_t size) { page_space_controller_.HintFreed(size); }
 
   int64_t UsedInWords() const { return usage_.used_in_words; }
   int64_t CapacityInWords() const {
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index e3a570c..3d6c231 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -315,13 +315,13 @@
 
 CodePtr BareSwitchableCallPattern::target() const {
   const uword pc = object_pool_.RawValueAt(target_pool_index_);
-  auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
-  if (rct->Contains(pc)) {
-    return rct->Lookup(pc);
+  CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+  if (result != Code::null()) {
+    return result;
   }
-  rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
-  if (rct->Contains(pc)) {
-    return rct->Lookup(pc);
+  result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+  if (result != Code::null()) {
+    return result;
   }
   UNREACHABLE();
 }
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 037e777..17b2243 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -457,13 +457,13 @@
 
 CodePtr BareSwitchableCallPattern::target() const {
   const uword pc = object_pool_.RawValueAt(target_pool_index_);
-  auto rct = IsolateGroup::Current()->reverse_pc_lookup_cache();
-  if (rct->Contains(pc)) {
-    return rct->Lookup(pc);
+  CodePtr result = ReversePc::Lookup(IsolateGroup::Current(), pc);
+  if (result != Code::null()) {
+    return result;
   }
-  rct = Dart::vm_isolate()->group()->reverse_pc_lookup_cache();
-  if (rct->Contains(pc)) {
-    return rct->Lookup(pc);
+  result = ReversePc::Lookup(Dart::vm_isolate()->group(), pc);
+  if (result != Code::null()) {
+    return result;
   }
   UNREACHABLE();
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index edeb8db..2ea406b 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -405,9 +405,6 @@
   // Ensure we destroy the heap before the other members.
   heap_ = nullptr;
   ASSERT(marking_stack_ == nullptr);
-
-  delete reverse_pc_lookup_cache_;
-  reverse_pc_lookup_cache_ = nullptr;
 }
 
 void IsolateGroup::RegisterIsolate(Isolate* isolate) {
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index df4b9ab..b8b23a1 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -73,7 +73,6 @@
 class ObjectPointerVisitor;
 class ObjectStore;
 class PersistentHandle;
-class ReversePcLookupCache;
 class RwLock;
 class SafepointRwLock;
 class SafepointHandler;
@@ -582,17 +581,6 @@
   ArrayPtr saved_unlinked_calls() const { return saved_unlinked_calls_; }
   void set_saved_unlinked_calls(const Array& saved_unlinked_calls);
 
-  // Returns the pc -> code lookup cache object for this isolate.
-  ReversePcLookupCache* reverse_pc_lookup_cache() const {
-    return reverse_pc_lookup_cache_;
-  }
-
-  // Sets the pc -> code lookup cache object for this isolate.
-  void set_reverse_pc_lookup_cache(ReversePcLookupCache* table) {
-    ASSERT(reverse_pc_lookup_cache_ == nullptr);
-    reverse_pc_lookup_cache_ = table;
-  }
-
   FieldTable* saved_initial_field_table() const {
     return saved_initial_field_table_.get();
   }
@@ -684,7 +672,6 @@
   std::unique_ptr<StoreBuffer> store_buffer_;
   std::unique_ptr<Heap> heap_;
   std::unique_ptr<DispatchTable> dispatch_table_;
-  ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
   ArrayPtr saved_unlinked_calls_;
   std::shared_ptr<FieldTable> saved_initial_field_table_;
   uint32_t isolate_group_flags_ = 0;
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 66ccafa..c413708 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -16187,8 +16187,8 @@
 }
 
 ObjectPoolPtr Code::GetObjectPool() const {
-#if defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_use_bare_instructions) {
+#if defined(DART_PRECOMPILER) || defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     return Isolate::Current()->object_store()->global_object_pool();
   }
 #endif
diff --git a/runtime/vm/object_store.h b/runtime/vm/object_store.h
index 7be73a4..169161f 100644
--- a/runtime/vm/object_store.h
+++ b/runtime/vm/object_store.h
@@ -215,7 +215,7 @@
   RW(Code, unreachable_tts_stub)                                               \
   RW(Code, slow_tts_stub)                                                      \
   RW(Array, dispatch_table_code_entries)                                       \
-  RW(Array, code_order_table)                                                  \
+  RW(GrowableObjectArray, code_order_tables)                                   \
   RW(Array, obfuscation_map)                                                   \
   RW(Class, ffi_pointer_class)                                                 \
   RW(Class, ffi_native_type_class)                                             \
diff --git a/runtime/vm/program_visitor.cc b/runtime/vm/program_visitor.cc
index 14708e3..13665eb 100644
--- a/runtime/vm/program_visitor.cc
+++ b/runtime/vm/program_visitor.cc
@@ -1402,29 +1402,36 @@
 
   void VisitClass(const Class& cls) {
     str_ = cls.Name();
-    Hash(str_);
+    VisitInstance(str_);
   }
 
   void VisitFunction(const Function& function) {
     str_ = function.name();
-    Hash(str_);
+    VisitInstance(str_);
   }
 
   void VisitCode(const Code& code) {
     pool_ = code.object_pool();
-    for (intptr_t i = 0; i < pool_.Length(); i++) {
-      if (pool_.TypeAt(i) == ObjectPool::EntryType::kTaggedObject) {
-        obj_ = pool_.ObjectAt(i);
-        if (obj_.IsInstance()) {
-          Hash(Instance::Cast(obj_));
-        }
-      }
-    }
+    VisitPool(pool_);
+
     instr_ = code.instructions();
     hash_ = CombineHashes(hash_, instr_.Hash());
   }
 
-  void Hash(const Instance& instance) {
+  void VisitPool(const ObjectPool& pool) {
+    if (pool.IsNull()) return;
+
+    for (intptr_t i = 0; i < pool.Length(); i++) {
+      if (pool.TypeAt(i) == ObjectPool::EntryType::kTaggedObject) {
+        obj_ = pool.ObjectAt(i);
+        if (obj_.IsInstance()) {
+          VisitInstance(Instance::Cast(obj_));
+        }
+      }
+    }
+  }
+
+  void VisitInstance(const Instance& instance) {
     hash_ = CombineHashes(hash_, instance.CanonicalizeHash());
   }
 
@@ -1445,6 +1452,8 @@
 
   ProgramHashVisitor visitor(zone);
   WalkProgram(zone, thread->isolate(), &visitor);
+  visitor.VisitPool(ObjectPool::Handle(
+      zone, thread->isolate()->object_store()->global_object_pool()));
   return visitor.hash();
 }
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index b410841..d76ec2f 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -2586,6 +2586,7 @@
   friend class Object;
   friend class ICData;            // For high performance access.
   friend class SubtypeTestCache;  // For high performance access.
+  friend class ReversePc;
 
   friend class OldPage;
 };
@@ -2607,6 +2608,7 @@
   ObjectPtr* to_snapshot(Snapshot::Kind kind) { return to(); }
 
   friend class SnapshotReader;
+  friend class ReversePc;
 };
 
 class LinkedHashMapLayout : public InstanceLayout {
diff --git a/runtime/vm/reverse_pc_lookup_cache.cc b/runtime/vm/reverse_pc_lookup_cache.cc
index e3d45ae..ef62406 100644
--- a/runtime/vm/reverse_pc_lookup_cache.cc
+++ b/runtime/vm/reverse_pc_lookup_cache.cc
@@ -5,52 +5,66 @@
 #include "vm/reverse_pc_lookup_cache.h"
 
 #include "vm/isolate.h"
+#include "vm/object.h"
+#include "vm/object_store.h"
 
 namespace dart {
 
+CodePtr ReversePc::Lookup(IsolateGroup* group,
+                          uword pc,
+                          bool is_return_address) {
 #if defined(DART_PRECOMPILED_RUNTIME)
+  // This can run in the middle of GC and must not allocate handles.
+  NoSafepointScope no_safepoint;
 
-static uword BeginPcFromCode(const CodePtr code) {
-  return Code::PayloadStartOf(code);
-}
+  if (is_return_address) {
+    pc--;
+  }
 
-static uword EndPcFromCode(const CodePtr code) {
-  return Code::PayloadStartOf(code) + Code::PayloadSizeOf(code);
-}
+  // This expected number of tables is low, so we go through them linearly. If
+  // this changes, would could sort the table list during deserialization and
+  // binary search for the table.
+  GrowableObjectArrayPtr tables = group->object_store()->code_order_tables();
+  intptr_t tables_length = Smi::Value(tables->ptr()->length_);
+  for (intptr_t i = 0; i < tables_length; i++) {
+    ArrayPtr table =
+        static_cast<ArrayPtr>(tables->ptr()->data_->ptr()->data()[i]);
+    intptr_t lo = 0;
+    intptr_t hi = Smi::Value(table->ptr()->length_) - 1;
 
-void ReversePcLookupCache::BuildAndAttachToIsolateGroup(
-    IsolateGroup* isolate_group) {
-  // This should be called once when the isolate group is created.
-  ASSERT(isolate_group->reverse_pc_lookup_cache() == nullptr);
+    // Fast check if pc belongs to this table.
+    if (lo > hi) {
+      continue;
+    }
+    CodePtr first = static_cast<CodePtr>(table->ptr()->data()[lo]);
+    if (pc < Code::PayloadStartOf(first)) {
+      continue;
+    }
+    CodePtr last = static_cast<CodePtr>(table->ptr()->data()[hi]);
+    if (pc >= (Code::PayloadStartOf(last) + Code::PayloadSizeOf(last))) {
+      continue;
+    }
 
-  auto object_store = isolate_group->object_store();
-  auto& array = Array::Handle(object_store->code_order_table());
-  if (!array.IsNull()) {
-    const intptr_t length = array.Length();
-    {
-      NoSafepointScope no_safepoint_scope;
-
-      const uword begin = BeginPcFromCode(static_cast<CodePtr>(array.At(0)));
-      const uword end =
-          EndPcFromCode(static_cast<CodePtr>(array.At(length - 1)));
-
-      auto pc_array = new uint32_t[length];
-      for (intptr_t i = 0; i < length; i++) {
-        const auto end_pc = EndPcFromCode(static_cast<CodePtr>(array.At(i)));
-        pc_array[i] = end_pc - begin;
+    // Binary search within the table for the matching Code.
+    while (lo <= hi) {
+      intptr_t mid = (hi - lo + 1) / 2 + lo;
+      ASSERT(mid >= lo);
+      ASSERT(mid <= hi);
+      CodePtr code = static_cast<CodePtr>(table->ptr()->data()[mid]);
+      uword code_start = Code::PayloadStartOf(code);
+      uword code_end = code_start + Code::PayloadSizeOf(code);
+      if (pc < code_start) {
+        hi = mid - 1;
+      } else if (pc >= code_end) {
+        lo = mid + 1;
+      } else {
+        return code;
       }
-#if defined(DEBUG)
-      for (intptr_t i = 1; i < length; i++) {
-        ASSERT(pc_array[i - 1] <= pc_array[i]);
-      }
-#endif  // defined(DEBUG)
-      auto cache =
-          new ReversePcLookupCache(isolate_group, pc_array, length, begin, end);
-      isolate_group->set_reverse_pc_lookup_cache(cache);
     }
   }
-}
-
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
+  return Code::null();
+}
+
 }  // namespace dart
diff --git a/runtime/vm/reverse_pc_lookup_cache.h b/runtime/vm/reverse_pc_lookup_cache.h
index d819956..8c45bb1 100644
--- a/runtime/vm/reverse_pc_lookup_cache.h
+++ b/runtime/vm/reverse_pc_lookup_cache.h
@@ -6,135 +6,20 @@
 #define RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
 
 #include "vm/allocation.h"
-#include "vm/growable_array.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
+#include "vm/globals.h"
+#include "vm/tagged_pointer.h"
 
 namespace dart {
 
-class Isolate;
+class IsolateGroup;
 
-#if defined(DART_PRECOMPILED_RUNTIME)
-
-// A cache for looking up a Code object based on pc (currently the cache is
-// implemented as a binary-searchable uint32 array)
-//
-// If an AOT snapshot was created with --use_bare_instructions the isolate's
-// object store will contain a `code_order_table` - which is a sorted array
-// of [Code] objects.  The order is based on addresses of the code's
-// instructions in memory.
-//
-// For a binary search we would need to touch O(log(array-size)) array entries,
-// code objects and instruction objects.
-//
-// To avoid this we make another uint32 array which is initialized from the end
-// PCs of the instructions (relative to the start pc of the first instruction
-// object).
-//
-// We have the following invariants:
-//
-//   BeginPcFromCode(code_array[0]) <= pc_array[0]
-//   pc_array[i] == EndPcFromCode(code_array[i])
-//   pc_array[i] <= pc_array[i+1]
-//
-// The lookup will then do a binary search in pc_array. The index can then be
-// used in the `code_order_table` of the object store.
-//
-// WARNING: This class cannot do memory allocation or handle allocation!
-class ReversePcLookupCache {
+class ReversePc : public AllStatic {
  public:
-  ReversePcLookupCache(IsolateGroup* isolate_group,
-                       uint32_t* pc_array,
-                       intptr_t length,
-                       uword first_absolute_pc,
-                       uword last_absolute_pc)
-      : isolate_group_(isolate_group),
-        pc_array_(pc_array),
-        length_(length),
-        first_absolute_pc_(first_absolute_pc),
-        last_absolute_pc_(last_absolute_pc) {}
-  ~ReversePcLookupCache() { delete[] pc_array_; }
-
-  // Builds a [ReversePcLookupCache] and attaches it to the isolate group (if
-  // `code_order_table` is non-`null`).
-  static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group);
-
-  // Returns `true` if the given [pc] contains can be mapped to a [Code] object
-  // using this cache.
-  inline bool Contains(uword pc) {
-    return first_absolute_pc_ <= pc && pc <= last_absolute_pc_;
-  }
-
-  // Looks up the [Code] object from a given [pc].
-  //
-  // If [is_return_address] is true, then the PC may be immediately after the
-  // payload, if the last instruction is a call that is guaranteed not to
-  // return. Otherwise, the PC must be within the payload.
-  inline CodePtr Lookup(uword pc, bool is_return_address = false) {
-    NoSafepointScope no_safepoint_scope;
-
-    intptr_t left = 0;
-    intptr_t right = length_ - 1;
-
-    ASSERT(first_absolute_pc_ <= pc && pc < last_absolute_pc_);
-    uint32_t pc_offset = static_cast<uint32_t>(pc - first_absolute_pc_);
-
-    while (left < right) {
-      intptr_t middle = left + (right - left) / 2;
-
-      uword middle_pc = pc_array_[middle];
-      if (middle_pc < pc_offset) {
-        left = middle + 1;
-      } else if (!is_return_address && middle_pc == pc_offset) {
-        // This case should only happen if we have bare instruction payloads.
-        // Otherwise, the instruction payloads of two RawInstructions objects
-        // will never be immediately adjacent in memory due to the header of
-        // the second object.
-        ASSERT(FLAG_use_bare_instructions);
-        left = middle + 1;
-        break;
-      } else {
-        right = middle;
-      }
-    }
-
-    auto code_array = isolate_group_->object_store()->code_order_table();
-    auto raw_code = static_cast<CodePtr>(Array::DataOf(code_array)[left]);
-
-#if defined(DEBUG)
-    ASSERT(raw_code->GetClassIdMayBeSmi() == kCodeCid);
-    ASSERT(Code::ContainsInstructionAt(raw_code, pc));
-#endif
-
-    return raw_code;
-  }
-
- private:
-  IsolateGroup* isolate_group_;
-  uint32_t* pc_array_;
-  intptr_t length_;
-  uword first_absolute_pc_;
-  uword last_absolute_pc_;
+  static CodePtr Lookup(IsolateGroup* group,
+                        uword pc,
+                        bool is_return_address = false);
 };
 
-#else  // defined(DART_PRECOMPILED_RUNTIME
-
-class ReversePcLookupCache {
- public:
-  ReversePcLookupCache() {}
-  ~ReversePcLookupCache() {}
-
-  static void BuildAndAttachToIsolateGroup(IsolateGroup* isolate_group) {}
-
-  inline bool Contains(uword pc) { return false; }
-
-  inline CodePtr Lookup(uword pc, bool is_return_address = false) {
-    UNREACHABLE();
-  }
-};
-
-#endif  // defined(DART_PRECOMPILED_RUNTIME
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_REVERSE_PC_LOOKUP_CACHE_H_
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 3c5b17b..9c14f6e 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -106,52 +106,47 @@
 #endif
 }
 
-IsolateGroup* StackFrame::IsolateGroupOfBareInstructionsFrame() const {
-  IsolateGroup* isolate_group = Dart::vm_isolate()->group();
-  if (isolate_group->object_store()->code_order_table() != Object::null()) {
-    auto rct = isolate_group->reverse_pc_lookup_cache();
-    if (rct->Contains(pc())) return isolate_group;
-  }
-
-  isolate_group = this->isolate_group();
-  auto* object_store = isolate_group->object_store();
-  if (object_store != nullptr) {
-    if (object_store->code_order_table() != Object::null()) {
-      auto rct = isolate_group->reverse_pc_lookup_cache();
-      if (rct->Contains(pc())) return isolate_group;
-    }
-  }
-
-  return nullptr;
-}
-
 bool StackFrame::IsBareInstructionsDartFrame() const {
   NoSafepointScope no_safepoint;
 
-  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
-    Code code;
-    auto rct = isolate_group->reverse_pc_lookup_cache();
-    code = rct->Lookup(pc(), /*is_return_address=*/true);
-
+  Code code;
+  code = ReversePc::Lookup(this->isolate_group(), pc(),
+                           /*is_return_address=*/true);
+  if (!code.IsNull()) {
     auto const cid = code.OwnerClassId();
     ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
     return cid == kFunctionCid;
   }
+  code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+                           /*is_return_address=*/true);
+  if (!code.IsNull()) {
+    auto const cid = code.OwnerClassId();
+    ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+    return cid == kFunctionCid;
+  }
+
   return false;
 }
 
 bool StackFrame::IsBareInstructionsStubFrame() const {
   NoSafepointScope no_safepoint;
 
-  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
-    Code code;
-    auto rct = isolate_group->reverse_pc_lookup_cache();
-    code = rct->Lookup(pc(), /*is_return_address=*/true);
-
+  Code code;
+  code = ReversePc::Lookup(this->isolate_group(), pc(),
+                           /*is_return_address=*/true);
+  if (!code.IsNull()) {
     auto const cid = code.OwnerClassId();
     ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
     return cid == kNullCid || cid == kClassCid;
   }
+  code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+                           /*is_return_address=*/true);
+  if (!code.IsNull()) {
+    auto const cid = code.OwnerClassId();
+    ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+    return cid == kNullCid || cid == kClassCid;
+  }
+
   return false;
 }
 
@@ -254,9 +249,8 @@
   NoSafepointScope no_safepoint;
   Code code;
 
-  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
-    auto const rct = isolate_group->reverse_pc_lookup_cache();
-    code = rct->Lookup(pc(), /*is_return_address=*/true);
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    code = GetCodeObject();
   } else {
     ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
         fp() + ((is_interpreted() ? kKBCPcMarkerSlotFromFp
@@ -397,11 +391,6 @@
   // where Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
 #endif
-  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
-    auto const rct = isolate_group->reverse_pc_lookup_cache();
-    return rct->Lookup(pc(), /*is_return_address=*/true);
-  }
-
   CodePtr code = GetCodeObject();
   if ((code != Code::null()) && Code::OwnerClassIdOf(code) == kFunctionCid) {
     return code;
@@ -411,16 +400,28 @@
 
 CodePtr StackFrame::GetCodeObject() const {
   ASSERT(!is_interpreted());
-  if (auto isolate_group = IsolateGroupOfBareInstructionsFrame()) {
-    auto const rct = isolate_group->reverse_pc_lookup_cache();
-    return rct->Lookup(pc(), /*is_return_address=*/true);
-  } else {
-    ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
-        fp() + runtime_frame_layout.code_from_fp * kWordSize));
-    ASSERT((pc_marker == Object::null()) ||
-           (pc_marker->GetClassId() == kCodeCid));
-    return static_cast<CodePtr>(pc_marker);
+
+#if defined(DART_PRECOMPILED_RUNTIME)
+  if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
+    CodePtr code = ReversePc::Lookup(isolate_group(), pc(),
+                                     /*is_return_address=*/true);
+    if (code != Code::null()) {
+      return code;
+    }
+    code = ReversePc::Lookup(Dart::vm_isolate()->group(), pc(),
+                             /*is_return_address=*/true);
+    if (code != Code::null()) {
+      return code;
+    }
+    UNREACHABLE();
   }
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+
+  ObjectPtr pc_marker = *(reinterpret_cast<ObjectPtr*>(
+      fp() + runtime_frame_layout.code_from_fp * kWordSize));
+  ASSERT((pc_marker == Object::null()) ||
+         (pc_marker->GetClassId() == kCodeCid));
+  return static_cast<CodePtr>(pc_marker);
 }
 
 BytecodePtr StackFrame::LookupDartBytecode() const {
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 1aeaa66..048ca63 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -95,13 +95,6 @@
   // Check validity of a frame, used for assertion purposes.
   virtual bool IsValid() const;
 
-  // Returns the isolate group containing the bare instructions of the
-  // current frame.
-  //
-  // If the frame does not belong to a bare instructions snapshot, it will
-  // return nullptr.
-  IsolateGroup* IsolateGroupOfBareInstructionsFrame() const;
-
   // Returns true iff the current frame is a bare instructions dart frame.
   bool IsBareInstructionsDartFrame() const;
 
diff --git a/tools/VERSION b/tools/VERSION
index 937cb75..cd9f864 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 10
 PATCH 0
-PRERELEASE 18
+PRERELEASE 19
 PRERELEASE_PATCH 0
\ No newline at end of file
diff --git a/tools/generate_package_config.dart b/tools/generate_package_config.dart
index 0caf03b..c24a655 100755
--- a/tools/generate_package_config.dart
+++ b/tools/generate_package_config.dart
@@ -32,6 +32,7 @@
     packageDirectory('pkg/front_end/testcases/nnbd/'),
     packageDirectory('pkg/front_end/testcases/nnbd_mixed/'),
     packageDirectory('pkg/front_end/testcases/nonfunction_type_aliases/'),
+    packageDirectory('pkg/front_end/testcases/value_class/'),
   ];
 
   var feAnalyzerSharedPackageDirs = [