Version 2.19.0-66.0.dev

Merge commit '09bcc1f4ae9ba1c09d2ce9d55fa8f1bcef66379e' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2038914..4d88f6f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -55,6 +55,11 @@
   non-final variable.
 - fix`use_build_context_synchronously` to handle `await`s in `if` conditions.
 
+#### Pub
+
+- Remove remaining support for `.packages` files. The flag
+  `--legacy-packages-file` is no longer supported.
+
 ### Core libraries
 
 #### `dart:io`
diff --git a/DEPS b/DEPS
index eb586c2..bf153a9 100644
--- a/DEPS
+++ b/DEPS
@@ -136,7 +136,7 @@
   "ply_rev": "604b32590ffad5cbb82e4afef1d305512d06ae93",
   "pool_rev": "fa84ddd0e39f45bf3f09dcc5d6b9fbdda7820fef",
   "protobuf_rev": "504eefeae9892602ea50c20159db1db3768012a9",
-  "pub_rev": "9bf4289d6fd5d6872a8929d6312bbd7098f3ea9c", # manually rev'd
+  "pub_rev": "ac7db6c07318efa4a8712110275eaf70f96a6d00", # manually rev'd
   "pub_semver_rev": "9fd28757ba45961ac5449e0f2b0020670e921475",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "shelf_rev": "0371a64bd3b99044ee3158bacf8813bba735a9c7",
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index c97b898..e3675de 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -114,12 +114,10 @@
 
 /// Return an [ElementKind] corresponding to the given [engine.Element].
 ElementKind convertElementToElementKind(engine.Element element) {
-  if (element is engine.ClassElement) {
-    if (element.isEnum) {
-      return ElementKind.ENUM;
-    } else if (element.isMixin) {
-      return ElementKind.MIXIN;
-    }
+  if (element is engine.EnumElement) {
+    return ElementKind.ENUM;
+  } else if (element is engine.MixinElement) {
+    return ElementKind.MIXIN;
   }
   if (element is engine.FieldElement && element.isEnumConstant) {
     return ElementKind.ENUM_CONSTANT;
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 36715bb..2be2073 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -174,7 +174,7 @@
       type = HighlightRegionType.CONSTRUCTOR;
       semanticType = SemanticTokenTypes.class_;
       semanticModifiers = {CustomSemanticTokenModifiers.constructor};
-    } else if (element.isEnum) {
+    } else if (element is EnumElement) {
       type = HighlightRegionType.ENUM;
     } else {
       type = HighlightRegionType.CLASS;
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 9b7736e..df05205 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -106,7 +106,7 @@
 
   final List<Element> _superElements = <Element>[];
   final List<Element> _interfaceElements = <Element>[];
-  final Set<ClassElement> _visited = <ClassElement>{};
+  final Set<InterfaceElement> _visited = {};
 
   factory _OverriddenElementsFinder(Element seed) {
     var class_ = seed.enclosingElement3 as ClassElement;
@@ -143,7 +143,7 @@
     return OverriddenElements(_seed, _superElements, _interfaceElements);
   }
 
-  void _addInterfaceOverrides(ClassElement? class_, bool checkType) {
+  void _addInterfaceOverrides(InterfaceElement? class_, bool checkType) {
     if (class_ == null) {
       return;
     }
@@ -159,13 +159,16 @@
     }
     // interfaces
     for (var interfaceType in class_.interfaces) {
-      _addInterfaceOverrides(interfaceType.element, true);
+      _addInterfaceOverrides(interfaceType.element2, true);
     }
     // super
-    _addInterfaceOverrides(class_.supertype?.element, checkType);
+    if (class_ is ClassElement) {
+      _addInterfaceOverrides(class_.supertype?.element2, checkType);
+    }
   }
 
-  void _addSuperOverrides(ClassElement? class_, {bool withThisType = true}) {
+  void _addSuperOverrides(InterfaceElement? class_,
+      {bool withThisType = true}) {
     if (class_ == null) {
       return;
     }
@@ -180,16 +183,20 @@
       }
     }
 
-    _addSuperOverrides(class_.supertype?.element);
-    for (var mixin_ in class_.mixins) {
-      _addSuperOverrides(mixin_.element);
+    if (class_ is ClassElement) {
+      _addSuperOverrides(class_.supertype?.element2);
     }
-    for (var constraint in class_.superclassConstraints) {
-      _addSuperOverrides(constraint.element);
+    for (var mixin_ in class_.mixins) {
+      _addSuperOverrides(mixin_.element2);
+    }
+    if (class_ is MixinElement) {
+      for (var constraint in class_.superclassConstraints) {
+        _addSuperOverrides(constraint.element2);
+      }
     }
   }
 
-  Element? _lookupMember(ClassElement classElement) {
+  Element? _lookupMember(InterfaceElement classElement) {
     Element? member;
     // method
     if (_kinds.contains(ElementKind.METHOD)) {
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 8c3dd26..c6548ab 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 
 /// Computer for Flutter specific outlines.
 class FlutterOutlineComputer {
@@ -131,10 +132,10 @@
   /// a widget reference outline item.
   protocol.FlutterOutline? _createOutline(Expression node, bool withGeneric) {
     var type = node.staticType;
-    if (type == null || !_flutter.isWidgetType(type)) {
+    if (type is! InterfaceType || !_flutter.isWidgetType(type)) {
       return null;
     }
-    var className = type.element!.displayName;
+    var className = type.element2.displayName;
 
     if (node is InstanceCreationExpression) {
       var attributes = <protocol.FlutterOutlineAttribute>[];
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
index 929a960..5cc0646 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_type_definition.dart
@@ -7,11 +7,12 @@
 import 'package:analysis_server/src/lsp/mapping.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element.dart' as analyzer;
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/dart/element/element.dart' show ElementImpl;
+import 'package:analyzer/src/dart/element/element.dart' as analyzer;
 import 'package:analyzer_plugin/protocol/protocol_common.dart' as plugin;
 import 'package:analyzer_plugin/utilities/analyzer_converter.dart';
 
@@ -69,8 +70,13 @@
         }
 
         final type = node is Expression ? _getType(node) : null;
-        final element = type?.element;
-        if (element is! ElementImpl) {
+        analyzer.Element? element;
+        if (type is InterfaceType) {
+          element = type.element2;
+        } else if (type is TypeParameterType) {
+          element = type.element;
+        }
+        if (element is! analyzer.ElementImpl) {
           return success(_emptyResult);
         }
 
@@ -118,7 +124,7 @@
     LineInfo originLineInfo,
     LineInfo targetLineInfo,
     AstNode originNode,
-    ElementImpl targetElement,
+    analyzer.ElementImpl targetElement,
     plugin.Location targetLocation,
   ) {
     final nameRange =
diff --git a/pkg/analysis_server/lib/src/search/type_hierarchy.dart b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
index f532954..0ca5a6b 100644
--- a/pkg/analysis_server/lib/src/search/type_hierarchy.dart
+++ b/pkg/analysis_server/lib/src/search/type_hierarchy.dart
@@ -23,7 +23,7 @@
   ClassElement? _pivotClass;
 
   final List<TypeHierarchyItem> _items = <TypeHierarchyItem>[];
-  final List<ClassElement> _itemClassElements = <ClassElement>[];
+  final List<InterfaceElement> _itemClassElements = [];
   final Map<Element, TypeHierarchyItem> _elementItemMap =
       HashMap<Element, TypeHierarchyItem>();
 
@@ -81,7 +81,7 @@
   }
 
   Future _createSubclasses(
-      TypeHierarchyItem item, int itemId, ClassElement classElement) async {
+      TypeHierarchyItem item, int itemId, InterfaceElement classElement) async {
     var subElements = await getDirectSubClasses(_searchEngine, classElement);
     var subItemIds = <int>[];
     for (var subElement in subElements) {
@@ -120,7 +120,7 @@
   }
 
   int _createSuperItem(
-      ClassElement classElement, List<DartType>? typeArguments) {
+      InterfaceElement classElement, List<DartType>? typeArguments) {
     // check for recursion
     var cachedItem = _elementItemMap[classElement];
     if (cachedItem != null) {
@@ -154,30 +154,30 @@
       _itemClassElements.add(classElement);
     }
     // superclass
-    {
+    if (classElement is ClassElement) {
       var superType = classElement.supertype;
       if (superType != null) {
         item.superclass = _createSuperItem(
-          superType.element,
+          superType.element2,
           superType.typeArguments,
         );
       }
     }
     // mixins
     for (var type in classElement.mixins) {
-      var id = _createSuperItem(type.element, type.typeArguments);
+      var id = _createSuperItem(type.element2, type.typeArguments);
       item.mixins.add(id);
     }
     // interfaces
     for (var type in classElement.interfaces) {
-      var id = _createSuperItem(type.element, type.typeArguments);
+      var id = _createSuperItem(type.element2, type.typeArguments);
       item.interfaces.add(id);
     }
     // done
     return itemId;
   }
 
-  ExecutableElement? _findMemberElement(ClassElement clazz) {
+  ExecutableElement? _findMemberElement(InterfaceElement clazz) {
     var pivotName = _pivotName;
     if (pivotName == null) {
       return null;
@@ -201,7 +201,7 @@
     }
     // try to find in the class mixin
     for (var mixin in clazz.mixins.reversed) {
-      var mixinElement = mixin.element;
+      var mixinElement = mixin.element2;
       if (_pivotKind == ElementKind.METHOD) {
         result = mixinElement.lookUpMethod(pivotName, _pivotLibrary);
       } else if (_pivotKind == ElementKind.GETTER) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
index 363121d..4026a57 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart
@@ -251,9 +251,9 @@
 
     var type = request.contextType;
     if (type is InterfaceType) {
-      var element = type.element;
+      var element = type.element2;
       var tag = '${element.librarySource.uri}::${element.name}';
-      if (element.isEnum) {
+      if (element is EnumElement) {
         includedSuggestionRelevanceTags.add(
           IncludedSuggestionRelevanceTag(
             tag,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
index fca2f3c..32db9fc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/extension_member_contributor.dart
@@ -44,7 +44,7 @@
           for (var type in types) {
             var inheritanceDistance = memberBuilder.request.featureComputer
                 .inheritanceDistanceFeature(
-                    thisExtendedType.element, type.element);
+                    thisExtendedType.element2, type.element2);
             _addTypeMembers(type, defaultKind, inheritanceDistance);
           }
           _addExtensionMembers(extensions, defaultKind, thisExtendedType);
@@ -114,7 +114,7 @@
       var inheritanceDistance = 0.0;
       if (type is InterfaceType && extendedType is InterfaceType) {
         inheritanceDistance = memberBuilder.request.featureComputer
-            .inheritanceDistanceFeature(type.element, extendedType.element);
+            .inheritanceDistanceFeature(type.element2, extendedType.element2);
       }
       // TODO(brianwilkerson) We might want to apply the substitution to the
       //  members of the extension for display purposes.
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
index df5b7456..03420db 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/feature_computer.dart
@@ -175,12 +175,11 @@
   protocol.ElementKind computeElementKind(Element element) {
     if (element is LibraryElement) {
       return protocol.ElementKind.PREFIX;
+    } else if (element is EnumElement) {
+      return protocol.ElementKind.ENUM;
+    } else if (element is MixinElement) {
+      return protocol.ElementKind.MIXIN;
     } else if (element is ClassElement) {
-      if (element.isEnum) {
-        return protocol.ElementKind.ENUM;
-      } else if (element.isMixin) {
-        return protocol.ElementKind.MIXIN;
-      }
       return protocol.ElementKind.CLASS;
     } else if (element is FieldElement && element.isEnumConstant) {
       return protocol.ElementKind.ENUM_CONSTANT;
@@ -276,7 +275,8 @@
   /// must be traversed in the type graph to get from the subtype to the
   /// supertype if the two types are not the same. Return `-1` if the [subclass]
   /// is not a subclass of the [superclass].
-  int inheritanceDistance(ClassElement subclass, ClassElement superclass) {
+  int inheritanceDistance(
+      InterfaceElement subclass, InterfaceElement superclass) {
     // This method is only visible for the metrics computation and might be made
     // private at some future date.
     return _inheritanceDistance(subclass, superclass, {});
@@ -286,7 +286,7 @@
   /// defined in the [superclass] that is being accessed through an expression
   /// whose static type is the [subclass].
   double inheritanceDistanceFeature(
-      ClassElement subclass, ClassElement superclass) {
+      InterfaceElement subclass, InterfaceElement superclass) {
     var distance = _inheritanceDistance(subclass, superclass, {});
     return _distanceToPercent(distance);
   }
@@ -460,8 +460,8 @@
   /// cycles in the type graph.
   ///
   /// This is the implementation of [inheritanceDistance].
-  int _inheritanceDistance(ClassElement? subclass, ClassElement superclass,
-      Set<ClassElement> visited) {
+  int _inheritanceDistance(InterfaceElement? subclass,
+      InterfaceElement superclass, Set<InterfaceElement> visited) {
     if (subclass == null) {
       return -1;
     } else if (subclass == superclass) {
@@ -469,19 +469,24 @@
     } else if (!visited.add(subclass)) {
       return -1;
     }
-    var minDepth =
-        _inheritanceDistance(subclass.supertype?.element, superclass, visited);
+    var minDepth = 0;
+    if (subclass is ClassElement) {
+      minDepth = _inheritanceDistance(
+          subclass.supertype?.element2, superclass, visited);
+    }
 
     void visitTypes(List<InterfaceType> types) {
       for (var type in types) {
-        var depth = _inheritanceDistance(type.element, superclass, visited);
+        var depth = _inheritanceDistance(type.element2, superclass, visited);
         if (minDepth < 0 || (depth >= 0 && depth < minDepth)) {
           minDepth = depth;
         }
       }
     }
 
-    visitTypes(subclass.superclassConstraints);
+    if (subclass is MixinElement) {
+      visitTypes(subclass.superclassConstraints);
+    }
     visitTypes(subclass.mixins);
     visitTypes(subclass.interfaces);
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index b8a7122..bdc06f4 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -140,7 +140,7 @@
 
   /// Add constructor suggestions for the given class.
   void _addConstructorSuggestions(ClassElement element) {
-    if (element.isEnum) {
+    if (element is EnumElement) {
       return;
     }
 
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 5389353..78c6b1b 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
@@ -149,7 +149,7 @@
         : CompletionSuggestionKind.INVOCATION;
     for (var type in classElement.allSupertypes) {
       var inheritanceDistance = request.featureComputer
-          .inheritanceDistanceFeature(classElement, type.element);
+          .inheritanceDistanceFeature(classElement, type.element2);
       _addSuggestionsForType(type, inheritanceDistance,
           isFunctionalArgument: isFunctionalArgument);
     }
@@ -419,7 +419,7 @@
 
       if (!opType.isPrefixed &&
           opType.includeConstructorSuggestions &&
-          !class_.isEnum) {
+          class_ is! EnumElement) {
         for (final constructor in class_.constructors) {
           if (!class_.isAbstract || constructor.isFactory) {
             builder.suggestConstructor(constructor);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index 83cc7a1..4730873 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -22,13 +22,13 @@
     if (node is ConstructorName) {
       if (node.parent is ConstructorReference) {
         var element = node.type.name.staticElement;
-        if (element is ClassElement) {
+        if (element is InterfaceElement) {
           _buildSuggestions(element);
         }
       } else {
         var type = node.type.type;
         if (type is InterfaceType) {
-          var element = type.element;
+          var element = type.element2;
           _buildSuggestions(element);
         }
       }
@@ -40,7 +40,11 @@
     }
   }
 
-  void _buildSuggestions(ClassElement element) {
+  void _buildSuggestions(InterfaceElement element) {
+    if (element is! ClassElement) {
+      return;
+    }
+
     var tearOff = request.shouldSuggestTearOff(element);
     var isLocalClassDecl = element.library == request.libraryElement;
     for (var constructor in element.constructors) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
index 9105538..15c1c55 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/redirecting_contributor.dart
@@ -38,7 +38,7 @@
         var containingClass =
             parent.thisOrAncestorOfType<ClassOrMixinDeclaration>();
         var superclassElement =
-            containingClass?.declaredElement?.supertype?.element;
+            containingClass?.declaredElement?.supertype?.element2;
         if (superclassElement != null) {
           for (var constructor in superclassElement.constructors) {
             if (constructor.isAccessibleIn2(request.libraryElement)) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 727aa03..c19440f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -7,6 +7,7 @@
 import 'package:analysis_server/src/utilities/extensions/completion_request.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 
 /// A contributor that produces suggestions based on the static members of a
 /// given class, enum, or extension. More concretely, this class produces
@@ -24,9 +25,11 @@
       var element = targetId.staticElement;
       if (element is TypeAliasElement) {
         var aliasedType = element.aliasedType;
-        element = aliasedType.element;
+        if (aliasedType is InterfaceType) {
+          element = aliasedType.element2;
+        }
       }
-      if (element is ClassElement) {
+      if (element is InterfaceElement) {
         for (var accessor in element.accessors) {
           if (accessor.isStatic &&
               !accessor.isSynthetic &&
@@ -34,7 +37,7 @@
             builder.suggestAccessor(accessor, inheritanceDistance: 0.0);
           }
         }
-        if (!request.shouldSuggestTearOff(element)) {
+        if (element is ClassElement && !request.shouldSuggestTearOff(element)) {
           for (var constructor in element.constructors) {
             if (isVisible(constructor)) {
               if (!element.isAbstract || constructor.isFactory) {
@@ -45,7 +48,7 @@
         }
         for (var field in element.fields) {
           if (field.isStatic &&
-              (!field.isSynthetic || element.isEnum) &&
+              (!field.isSynthetic || element is EnumElement) &&
               isVisible(field)) {
             builder.suggestField(field, inheritanceDistance: 0.0);
           }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index be909a3..482a4cd 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'dart:collection';
-
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
@@ -251,7 +249,7 @@
     }
     for (var targetType in types) {
       var inheritanceDistance = request.featureComputer
-          .inheritanceDistanceFeature(type.element, targetType.element);
+          .inheritanceDistanceFeature(type.element2, targetType.element2);
       for (var method in targetType.methods) {
         // Exclude static methods when completion on an instance.
         if (!method.isStatic) {
@@ -288,11 +286,11 @@
     // classes seen (not the interfaces) so that we won't be fooled by nonsense
     // like "class C<T> extends C<List<T>> {}"
     var result = <InterfaceType>[];
-    Set<ClassElement> classesSeen = HashSet<ClassElement>();
+    final classesSeen = <InterfaceElement>{};
     var typesToVisit = <InterfaceType>[type];
     while (typesToVisit.isNotEmpty) {
       var nextType = typesToVisit.removeLast();
-      if (!classesSeen.add(nextType.element)) {
+      if (!classesSeen.add(nextType.element2)) {
         // Class had already been seen, so ignore this type.
         continue;
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index a890ab1..9352788 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -54,7 +54,7 @@
 
   /// Return the class, enum or mixin declaration for the given [element].
   Future<ClassOrMixinDeclaration?> getClassOrMixinDeclaration(
-      ClassElement element) async {
+      InterfaceElement element) async {
     var result = await sessionHelper.getElementDeclaration(element);
     var node = result?.node;
     if (node is ClassOrMixinDeclaration) {
@@ -76,10 +76,10 @@
 
   /// Return the class element associated with the [target], or `null` if there
   /// is no such class element.
-  ClassElement? getTargetClassElement(Expression target) {
+  InterfaceElement? getTargetClassElement(Expression target) {
     var type = target.staticType;
     if (type is InterfaceType) {
-      return type.element;
+      return type.element2;
     } else if (target is Identifier) {
       var element = target.staticElement;
       if (element is ClassElement) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index f33b3e7..aa2aa6a 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -209,8 +209,7 @@
   }
 
   bool _isEnum(DartType type) {
-    final element = type.element;
-    return element is ClassElement && element.isEnum;
+    return type is InterfaceType && type.element2 is EnumElement;
   }
 
   bool _isIterable(DartType type) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
index f2046c1..b6d4ac3 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_case_clauses.dart
@@ -35,8 +35,8 @@
     var enumConstantNames = <String>[];
     var expressionType = statement.expression.staticType;
     if (expressionType is InterfaceType) {
-      var enumElement = expressionType.element;
-      if (enumElement.isEnum) {
+      var enumElement = expressionType.element2;
+      if (enumElement is EnumElement) {
         enumName = enumElement.name;
         for (var field in enumElement.fields) {
           if (field.isEnumConstant) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_like_case_clauses.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_like_case_clauses.dart
index a6fb1cd..3e89593 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_like_case_clauses.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_missing_enum_like_case_clauses.dart
@@ -26,7 +26,7 @@
       if (expressionType is! InterfaceType) {
         return;
       }
-      var classElement = expressionType.element;
+      var classElement = expressionType.element2;
       var className = classElement.name;
       var caseNames = _caseNames(node);
       var missingNames = _constantNames(classElement)
@@ -86,7 +86,7 @@
   }
 
   /// Return the names of the constants defined in [classElement].
-  List<String> _constantNames(ClassElement classElement) {
+  List<String> _constantNames(InterfaceElement classElement) {
     var type = classElement.thisType;
     var constantNames = <String>[];
     for (var field in classElement.fields) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
index b704649..dd30630 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
@@ -320,7 +320,7 @@
   }
 
   void _updateFinderWithClassMembers(
-      _ClosestElementFinder finder, ClassElement clazz) {
+      _ClosestElementFinder finder, InterfaceElement clazz) {
     var members = getMembers(clazz);
     finder._updateList(members);
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
index fe203e6..3ebbb8f7 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_enum.dart
@@ -560,7 +560,7 @@
               //   class.
               if (fieldElement.isConst &&
                   fieldType is InterfaceType &&
-                  fieldType.element == classElement) {
+                  fieldType.element2 == classElement) {
                 var initializer = field.initializer;
                 if (initializer is InstanceCreationExpression) {
                   var constructorElement =
@@ -728,13 +728,13 @@
       throw _CannotConvertException('Unresolved');
     }
     if (element != classElement) {
-      if (element.supertype?.element == classElement) {
+      if (element.supertype?.element2 == classElement) {
         throw _CannotConvertException('Class is extended');
       } else if (element.interfaces
-          .map((e) => e.element)
+          .map((e) => e.element2)
           .contains(classElement)) {
         throw _CannotConvertException('Class is implemented');
-      } else if (element.mixins.map((e) => e.element).contains(classElement)) {
+      } else if (element.mixins.map((e) => e.element2).contains(classElement)) {
         // This case won't occur unless there's an error in the source code, but
         // it's easier to check for the condition than it is to check for the
         // diagnostic.
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
index 37d5c4d..2f73d89 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_class_to_mixin.dart
@@ -38,7 +38,7 @@
 
     var classElement = classDeclaration.declaredElement!;
     for (var type in classElement.mixins) {
-      if (referencedClasses.contains(type.element)) {
+      if (referencedClasses.contains(type.element2)) {
         superclassConstraints.add(type);
       } else {
         interfaces.add(type);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_for_index.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_for_index.dart
index 0982c01..498bd7f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_into_for_index.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_into_for_index.dart
@@ -52,7 +52,7 @@
     {
       var iterableType = iterable.staticType;
       if (iterableType is! InterfaceType ||
-          iterableType.element != typeProvider.listElement) {
+          iterableType.element2 != typeProvider.listElement) {
         return;
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_list_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_list_literal.dart
index 62d6308..e21fdfc 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_list_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_list_literal.dart
@@ -41,7 +41,7 @@
     var type = creation.staticType;
     if (node.offset > creation.argumentList.offset ||
         type is! InterfaceType ||
-        type.element != typeProvider.listElement ||
+        type.element2 != typeProvider.listElement ||
         creation.constructorName.name != null ||
         creation.argumentList.arguments.isNotEmpty) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_map_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_map_literal.dart
index 1502cd0..3197d24 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_map_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_map_literal.dart
@@ -45,7 +45,7 @@
         creation.constructorName.name != null ||
         creation.argumentList.arguments.isNotEmpty ||
         type is! InterfaceType ||
-        !_isMapClass(type.element)) {
+        !_isMapClass(type.element2)) {
       return;
     }
     //
@@ -67,7 +67,7 @@
 
   /// Return `true` if the [element] represents either the class `Map` or
   /// `LinkedHashMap`.
-  bool _isMapClass(ClassElement element) =>
+  bool _isMapClass(InterfaceElement element) =>
       element == typeProvider.mapElement ||
       (element.name == 'LinkedHashMap' &&
           element.library.name == 'dart.collection');
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_set_literal.dart b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_set_literal.dart
index 2ba09b0..2dccd1e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/convert_to_set_literal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/convert_to_set_literal.dart
@@ -145,7 +145,7 @@
     }
 
     // TODO(brianwilkerson) Consider also accepting uses of LinkedHashSet.
-    if (type.element != typeProvider.setElement) {
+    if (type.element2 != typeProvider.setElement) {
       return null;
     }
     return creation;
@@ -195,13 +195,16 @@
     var parent = creation.parent!;
     if (parent is VariableDeclaration) {
       var parent2 = parent.parent;
-      if (parent2 is VariableDeclarationList &&
-          parent2.type?.type?.element == typeProvider.setElement) {
-        return true;
+      if (parent2 is VariableDeclarationList) {
+        final type = parent2.type?.type;
+        if (type is InterfaceType && type.element2 == typeProvider.setElement) {
+          return true;
+        }
       }
     } else if (parent.parent is InvocationExpression) {
       var parameterElement = creation.staticParameterElement;
-      if (parameterElement?.type.element == typeProvider.setElement) {
+      final type = parameterElement?.type;
+      if (type is InterfaceType && type.element2 == typeProvider.setElement) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
index b6b921c..064a881 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
@@ -77,7 +77,7 @@
     }
 
     // prepare target ClassDeclaration
-    var targetElement = targetType.element;
+    var targetElement = targetType.element2;
     var targetResult = await sessionHelper.getElementDeclaration(targetElement);
     if (targetResult == null) {
       return;
@@ -202,7 +202,7 @@
   Future<void> _write(
     ChangeBuilder builder,
     Token name,
-    ClassElement targetElement,
+    InterfaceElement targetElement,
     InsertionLocation targetLocation, {
     Token? constructorName,
     bool isConst = false,
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
index 4da661d..5d3b40f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_field.dart
@@ -76,7 +76,7 @@
     }
     // prepare target ClassElement
     var staticModifier = false;
-    ClassElement? targetClassElement;
+    InterfaceElement? targetClassElement;
     if (target != null) {
       targetClassElement = getTargetClassElement(target);
       // maybe static
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
index ad72979..9900a1e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_getter.dart
@@ -55,7 +55,7 @@
       if (targetType is! InterfaceType) {
         return;
       }
-      targetElement = targetType.element;
+      targetElement = targetType.element2;
       // maybe static
       if (target is Identifier) {
         var targetIdentifier = target;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
index 9eb4968..6c77773 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_method_or_function.dart
@@ -30,14 +30,14 @@
     var nameNode = node;
     if (nameNode is SimpleIdentifier) {
       // prepare argument expression (to get parameter)
-      ClassElement? targetElement;
+      InterfaceElement? targetElement;
       Expression argument;
       {
         var target = getQualifiedPropertyTarget(node);
         if (target != null) {
           var targetType = target.staticType;
           if (targetType is InterfaceType) {
-            targetElement = targetType.element;
+            targetElement = targetType.element2;
             argument = target.parent as Expression;
           } else {
             return;
@@ -140,7 +140,7 @@
   /// Adds proposal for creating method corresponding to the given
   /// [FunctionType] in the given [ClassElement].
   Future<void> _createMethod(ChangeBuilder builder,
-      ClassElement targetClassElement, FunctionType functionType) async {
+      InterfaceElement targetClassElement, FunctionType functionType) async {
     var name = (node as SimpleIdentifier).name;
     // prepare environment
     var targetSource = targetClassElement.source;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
index 5133d6a..3198c16 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_setter.dart
@@ -54,7 +54,7 @@
       if (targetType is! InterfaceType) {
         return;
       }
-      targetElement = targetType.element;
+      targetElement = targetType.element2;
       // maybe static
       if (target is Identifier) {
         var targetIdentifier = target;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
index 0280d715..e6c8d34 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/flutter_convert_to_stateless_widget.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer_plugin/utilities/assist/assist.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
+import 'package:collection/collection.dart';
 
 class FlutterConvertToStatelessWidget extends CorrectionProducer {
   @override
@@ -250,15 +251,15 @@
   }
 
   static bool _isState(ClassElement widgetClassElement, DartType? type) {
-    if (type is! ParameterizedType) return false;
+    if (type is! InterfaceType) return false;
 
-    var typeArguments = type.typeArguments;
-    if (typeArguments.length != 1 ||
-        typeArguments[0].element != widgetClassElement) {
+    final firstArgument = type.typeArguments.singleOrNull;
+    if (firstArgument is! InterfaceType ||
+        firstArgument.element2 != widgetClassElement) {
       return false;
     }
 
-    var classElement = type.element;
+    var classElement = type.element2;
     return classElement is ClassElement &&
         Flutter.instance.isExactState(classElement);
   }
@@ -381,7 +382,8 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     super.visitInstanceCreationExpression(node);
-    if (node.staticType?.element != stateClassElement) {
+    final type = node.staticType;
+    if (type is! InterfaceType || type.element2 != stateClassElement) {
       return;
     }
     var methodDeclaration = node.thisOrAncestorOfType<MethodDeclaration>();
@@ -397,9 +399,10 @@
   @override
   void visitMethodInvocation(MethodInvocation node) {
     var type = node.staticType;
-    if (node.methodName.name == 'createState' &&
+    if (type is InterfaceType &&
+        node.methodName.name == 'createState' &&
         (FlutterConvertToStatelessWidget._isState(widgetClassElement, type) ||
-            type?.element == stateClassElement)) {
+            type.element2 == stateClassElement)) {
       used = true;
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
index 9f1cc96..a255bf5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
@@ -5,7 +5,7 @@
 import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -32,14 +32,16 @@
       return;
     }
 
-    var element = namedType.typeOrThrow.element;
-    if (element is ClassElement &&
-        element.typeParameters.length == typeArguments.arguments.length) {
-      await builder.addDartFileEdit(file, (builder) {
-        var argumentText = utils.getNodeText(typeArguments);
-        builder.addSimpleInsertion(namedType.end, argumentText);
-        builder.addDeletion(range.node(typeArguments));
-      });
+    final type = namedType.typeOrThrow;
+    if (type is InterfaceType) {
+      final element = type.element2;
+      if (element.typeParameters.length == typeArguments.arguments.length) {
+        await builder.addDartFileEdit(file, (builder) {
+          var argumentText = utils.getNodeText(typeArguments);
+          builder.addSimpleInsertion(namedType.end, argumentText);
+          builder.addDeletion(range.node(typeArguments));
+        });
+      }
     }
   }
 }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
index 0157194..0ea7777 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_descriptor.dart
@@ -153,12 +153,12 @@
             // that the method might have been in the element's class.
             return true;
           }
-          if (components[1] == type.element?.name) {
-            return true;
-          }
           if (type is InterfaceType) {
+            if (components[1] == type.element2.name) {
+              return true;
+            }
             for (var supertype in type.allSupertypes) {
-              if (components[1] == supertype.element.name) {
+              if (components[1] == supertype.element2.name) {
                 return true;
               }
             }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index f430cad..3bb402a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -381,7 +381,7 @@
     var targetType = node.prefix.staticType;
     if (targetType is InterfaceType) {
       _addMatcher(
-        components: [node.identifier.name, targetType.element.name],
+        components: [node.identifier.name, targetType.element2.name],
         kinds: const [
           ElementKind.constantKind,
           ElementKind.fieldKind,
@@ -527,7 +527,7 @@
       var type = target.staticType;
       if (type != null) {
         if (type is InterfaceType) {
-          return type.element.name;
+          return type.element2.name;
         } else if (type.isDynamic) {
           // The name is likely to be undefined.
           return target.name;
@@ -538,7 +538,7 @@
     } else if (target != null) {
       var type = target.staticType;
       if (type is InterfaceType) {
-        return type.element.name;
+        return type.element2.name;
       }
       return null;
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index 63b84f6..e231951 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -66,7 +66,7 @@
     } else if (expectedType.isDartCoreString) {
       _addSingleCharacterName(excluded, res, 0x73);
     } else if (expectedType is InterfaceType) {
-      var className = expectedType.element.name;
+      var className = expectedType.element2.name;
       _addAll(excluded, res, getCamelWordCombinations(className));
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 05db61d..fa3cf96 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -530,7 +530,7 @@
 
   /// The [ClassElement] the generated code is inserted to, so we can decide if
   /// a type parameter may or may not be used.
-  ClassElement? targetClassElement;
+  InterfaceElement? targetClassElement;
 
   ExecutableElement? targetExecutableElement;
 
@@ -914,7 +914,7 @@
     if (type is InterfaceType) {
       return _getTypeCodeElementArguments(
         librariesToImport: librariesToImport,
-        element: type.element,
+        element: type.element2,
         isNullable: type.nullabilitySuffix == NullabilitySuffix.question,
         typeArguments: type.typeArguments,
       );
diff --git a/pkg/analysis_server/lib/src/services/flutter/class_description.dart b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
index a592206..0bdd780 100644
--- a/pkg/analysis_server/lib/src/services/flutter/class_description.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
@@ -38,7 +38,11 @@
 
   /// If we know how to materialize the [element], return [ClassDescription].
   /// Otherwise return `null`.
-  ClassDescription? get(ClassElement element) {
+  ClassDescription? get(InterfaceElement element) {
+    if (element is! ClassElement) {
+      return null;
+    }
+
     var description = _map[element];
     if (description == null) {
       description = _classDescription(element);
@@ -52,7 +56,7 @@
   /// Return `true` if properties should be created for instances of [type].
   bool hasNestedProperties(DartType type) {
     if (type is InterfaceType) {
-      return _isOptedInClass(type.element);
+      return _isOptedInClass(type.element2);
     }
     return false;
   }
@@ -72,7 +76,11 @@
     return ClassDescription(element, constructor);
   }
 
-  bool _isOptedInClass(ClassElement element) {
+  bool _isOptedInClass(InterfaceElement element) {
+    if (element is! ClassElement) {
+      return false;
+    }
+
     return _isClass(
           element,
           'package:flutter/src/widgets/container.dart',
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
index 7e79982..417fa0b 100644
--- a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -390,7 +390,7 @@
       var type = parameter.type;
       if (type is InterfaceType) {
         var classDescription = classRegistry.get(
-          type.element,
+          type.element2,
         );
         if (classDescription != null) {
           _addProperties(
@@ -404,7 +404,7 @@
   }
 
   List<protocol.FlutterWidgetPropertyValueEnumItem> _enumItemsForEnum(
-    ClassElement element,
+    EnumElement element,
   ) {
     return element.fields
         .where((field) => field.isStatic && field.isEnumConstant)
@@ -462,8 +462,8 @@
       );
     }
     if (type is InterfaceType) {
-      var classElement = type.element;
-      if (classElement.isEnum) {
+      var classElement = type.element2;
+      if (classElement is EnumElement) {
         return protocol.FlutterWidgetPropertyEditor(
           protocol.FlutterWidgetPropertyEditorKind.ENUM,
           enumItems: _enumItemsForEnum(classElement),
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index e411d2d..1a1b226 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -305,7 +305,7 @@
 
       // extends
       var supertype = _enclosingClassElement!.supertype;
-      var supertypeElement = supertype?.element;
+      var supertypeElement = supertype?.element2;
       if (supertypeElement != null) {
         var recordSupertypeVName =
             _vNameFromElement(supertypeElement, schema.RECORD_KIND);
@@ -317,7 +317,7 @@
       var interfaces = _enclosingClassElement!.interfaces;
       for (var interface in interfaces) {
         var recordInterfaceVName =
-            _vNameFromElement(interface.element, schema.RECORD_KIND);
+            _vNameFromElement(interface.element2, schema.RECORD_KIND);
         addEdge(
             _enclosingClassVName!, schema.EXTENDS_EDGE, recordInterfaceVName);
       }
@@ -326,7 +326,7 @@
       var mixins = _enclosingClassElement!.mixins;
       for (var mixin in mixins) {
         var recordMixinVName =
-            _vNameFromElement(mixin.element, schema.RECORD_KIND);
+            _vNameFromElement(mixin.element2, schema.RECORD_KIND);
         addEdge(_enclosingClassVName!, schema.EXTENDS_EDGE, recordMixinVName);
       }
 
@@ -383,7 +383,7 @@
       var interfaces = _enclosingClassElement!.interfaces;
       for (var interface in interfaces) {
         var recordInterfaceVName =
-            _vNameFromElement(interface.element, schema.RECORD_KIND);
+            _vNameFromElement(interface.element2, schema.RECORD_KIND);
         addEdge(
             _enclosingClassVName!, schema.EXTENDS_EDGE, recordInterfaceVName);
       }
@@ -392,7 +392,7 @@
       var mixins = _enclosingClassElement!.mixins;
       for (var mixin in mixins) {
         var recordMixinVName =
-            _vNameFromElement(mixin.element, schema.RECORD_KIND);
+            _vNameFromElement(mixin.element2, schema.RECORD_KIND);
         addEdge(_enclosingClassVName!, schema.EXTENDS_EDGE, recordMixinVName);
       }
 
@@ -1023,18 +1023,18 @@
 
   void _handleThisOrSuper(Expression thisOrSuperNode) {
     var type = thisOrSuperNode.staticType;
-    if (type != null && type.element != null) {
+    if (type is InterfaceType) {
       // Expected SuperExpression.staticType to return the type of the
       // supertype, but it returns the type of the enclosing class (same as
       // ThisExpression), do some additional work to correct assumption:
-      if (thisOrSuperNode is SuperExpression && type.element is ClassElement) {
-        var supertype = (type.element as ClassElement).supertype;
+      if (thisOrSuperNode is SuperExpression && type.element2 is ClassElement) {
+        var supertype = (type.element2 as ClassElement).supertype;
         if (supertype != null) {
           type = supertype;
         }
       }
       // vname
-      var vName = _vNameFromElement(type.element, schema.RECORD_KIND);
+      var vName = _vNameFromElement(type.element2, schema.RECORD_KIND);
 
       // anchor
       var anchorVName = addAnchorEdgesContainingEdge(
@@ -1318,8 +1318,8 @@
         var paramTypeVName = dynamicBuiltin;
         var declaredElement = paramNode.declaredElement!;
         var type = declaredElement.type;
-        if (!type.isDynamic) {
-          paramTypeVName = _vNameFromElement(type.element, schema.TAPP_KIND);
+        if (type is InterfaceType) {
+          paramTypeVName = _vNameFromElement(type.element2, schema.TAPP_KIND);
         }
         addEdge(funcTypeVName, schema.PARAM_EDGE, paramTypeVName,
             ordinalIntValue: i++);
@@ -1395,8 +1395,8 @@
       return dynamicBuiltin;
     } else if (type.isVoid) {
       return voidBuiltin;
-    } else if (type.element is ClassElement) {
-      return _vNameFromElement(type.element, schema.RECORD_KIND);
+    } else if (type is InterfaceType) {
+      return _vNameFromElement(type.element2, schema.RECORD_KIND);
     } else {
       return dynamicBuiltin;
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_context.dart b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_context.dart
new file mode 100644
index 0000000..4d5fa5f
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_context.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2022, 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:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
+
+/// The context in which a refactoring was requested.
+class RefactoringContext {
+  /// The result of resolving the compilation unit in which a refactoring was
+  /// requested.
+  final ResolvedUnitResult resolvedResult;
+
+  /// The offset to the beginning of the selection range.
+  final int selectionOffset;
+
+  /// The number of selected characters.
+  final int selectionLength;
+
+  /// The helper used to efficiently access resolved units.
+  late final AnalysisSessionHelper sessionHelper =
+      AnalysisSessionHelper(session);
+
+  /// Initialize a newly created context based on the [resolvedResult].
+  RefactoringContext({
+    required this.resolvedResult,
+    required this.selectionOffset,
+    required this.selectionLength,
+  });
+
+  /// Return the analysis session in which additional resolution can occur.
+  AnalysisSession get session => resolvedResult.session;
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_processor.dart b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_processor.dart
new file mode 100644
index 0000000..9d21427
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_processor.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2022, 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/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/services/refactoring/framework/refactoring_context.dart';
+import 'package:analysis_server/src/services/refactoring/framework/refactoring_producer.dart';
+
+/// A function that can be executed to create a refactoring producer.
+typedef ProducerGenerator = RefactoringProducer Function(RefactoringContext);
+
+class RefactoringProcessor {
+  /// A list of the generators used to produce refactorings.
+  static const List<ProducerGenerator> generators = [
+    // MoveTopLevelToFile.new,
+  ];
+
+  /// The context in which the refactorings could be applied.
+  final RefactoringContext context;
+
+  RefactoringProcessor(this.context);
+
+  /// Return a list containing one code action for each of the refactorings that
+  /// are available in the current context.
+  Future<List<CodeAction>> compute() async {
+    var refactorings = <CodeAction>[];
+    for (var i = 0; i < generators.length; i++) {
+      var generator = generators[i];
+      var producer = generator(context);
+      if (producer.isAvailable()) {
+        refactorings.add(
+          CodeAction(
+              title: producer.title,
+              kind: producer.kind,
+              command: Command(
+                command: producer.commandName,
+                title: producer.title,
+              ),
+              data: {
+                'filePath': context.resolvedResult.path,
+                'selectionOffset': context.selectionOffset,
+                'selectionLength': context.selectionLength,
+                'parameters': producer.parameters,
+              }),
+        );
+      }
+    }
+    return refactorings;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_producer.dart b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_producer.dart
new file mode 100644
index 0000000..c45f0f0
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/framework/refactoring_producer.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2022, 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/lsp_protocol/protocol_custom_generated.dart';
+import 'package:analysis_server/lsp_protocol/protocol_generated.dart';
+import 'package:analysis_server/src/services/refactoring/framework/refactoring_context.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+
+/// An object that can compute a refactoring in a Dart file.
+abstract class RefactoringProducer {
+  /// The context in which the refactoring was requested.
+  final RefactoringContext _context;
+
+  /// Initialize a newly created refactoring producer to create a refactoring in
+  /// the given [_context].
+  RefactoringProducer(this._context);
+
+  /// Return the command name used to apply this refactoring.
+  String get commandName;
+
+  /// Return the kind of refactoring this producer produces. Subclasses should
+  /// override this method if they produce a subtype of the type
+  /// [CodeActionKind.Refactor], such as [CodeActionKind.RefactorExtract],
+  /// [CodeActionKind.RefactorInline], or [CodeActionKind.RefactorRewrite].
+  CodeActionKind get kind => CodeActionKind.Refactor;
+
+  /// Return a list of the parameters to send to the client.
+  List<CommandParameter> get parameters;
+
+  /// Return the offset of the first character after the selection range.
+  int get selectionEnd => selectionOffset + selectionLength;
+
+  /// Return the number of selected characters.
+  int get selectionLength => _context.selectionLength;
+
+  /// Return the offset of the beginning of the selection range.
+  int get selectionOffset => _context.selectionOffset;
+
+  /// Return the helper used to efficiently access resolved units.
+  AnalysisSessionHelper get sessionHelper => _context.sessionHelper;
+
+  /// Return the title of this refactoring.
+  String get title;
+
+  /// Given the [commandArguments] associated with the command, use the
+  /// [builder] to generate the edits necessary to apply this refactoring.
+  Future<void> compute(List<String> commandArguments, ChangeBuilder builder);
+
+  /// Return `true` if this refactoring is available in the given context.
+  bool isAvailable();
+}
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
index c18f88f..3bf7ff6 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_method.dart
@@ -794,7 +794,8 @@
     } else {
       variableType = _getTypeCode(returnTypeObj);
       if (_hasAwait) {
-        if (returnTypeObj.element != typeProvider.futureElement) {
+        if (returnTypeObj is InterfaceType &&
+            returnTypeObj.element2 != typeProvider.futureElement) {
           returnType = _getTypeCode(typeProvider.futureType(returnTypeObj));
         }
       } else {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
index 85bbc24..2110a70 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/extract_widget.dart
@@ -617,7 +617,7 @@
   final Set<Element> uniqueElements = <Element>{};
   final List<_Parameter> parameters = [];
 
-  List<ClassElement>? enclosingClasses;
+  List<InterfaceElement>? enclosingClasses;
 
   _ParametersCollector(this.enclosingClass, this.expressionRange);
 
@@ -665,9 +665,9 @@
   bool _isMemberOfEnclosingClass(Element element) {
     final enclosingClass = this.enclosingClass;
     if (enclosingClass != null) {
-      final enclosingClasses = this.enclosingClasses ??= <ClassElement>[
+      final enclosingClasses = this.enclosingClasses ??= <InterfaceElement>[
         enclosingClass,
-        ...enclosingClass.allSupertypes.map((t) => t.element)
+        ...enclosingClass.allSupertypes.map((t) => t.element2)
       ];
       return enclosingClasses.contains(element.enclosingElement3);
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
index c44741a..3de049d 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/inline_method.dart
@@ -162,7 +162,7 @@
     var enclosingClassElement = getEnclosingClassElement(node);
     if (enclosingClassElement != null) {
       var elements = [
-        ...enclosingClassElement.allSupertypes.map((e) => e.element),
+        ...enclosingClassElement.allSupertypes.map((e) => e.element2),
         enclosingClassElement,
       ];
       for (var classElement in elements) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_class_member.dart b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_class_member.dart
index cafd967..cbd303c 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_class_member.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/legacy/rename_class_member.dart
@@ -161,9 +161,10 @@
 
   Future<void> _checkHierarchy({
     required bool isRename,
-    required Set<ClassElement> subClasses,
+    required Set<InterfaceElement> subClasses,
   }) async {
-    var superClasses = elementClass.allSupertypes.map((e) => e.element).toSet();
+    var superClasses =
+        elementClass.allSupertypes.map((e) => e.element2).toSet();
     // check shadowing in the hierarchy
     var declarations = await searchEngine.searchMemberDeclarations(name);
     for (var declaration in declarations) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/move_top_level_to_file.dart b/pkg/analysis_server/lib/src/services/refactoring/move_top_level_to_file.dart
new file mode 100644
index 0000000..0c0bb5b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/refactoring/move_top_level_to_file.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2022, 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/lsp_protocol/protocol_custom_generated.dart';
+import 'package:analysis_server/src/services/refactoring/framework/refactoring_producer.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
+
+/// An object that can compute a refactoring in a Dart file.
+class MoveTopLevelToFile extends RefactoringProducer {
+  @override
+  late String title;
+
+  /// The default path of the file to which the declaration should be moved.
+  late String defaultFilePath;
+
+  /// Initialize a newly created refactoring producer to use the given
+  /// [context].
+  MoveTopLevelToFile(super.context);
+
+  @override
+  String get commandName => 'move_top_level_to_file';
+
+  @override
+  List<CommandParameter> get parameters => [
+        CommandParameter(
+          label: 'Move to:',
+          type: CommandParameterType.filePath,
+          defaultValue: defaultFilePath,
+        ),
+      ];
+
+  @override
+  Future<void> compute(List<String> commandArguments, ChangeBuilder builder) {
+    // TODO: implement compute
+    throw UnimplementedError();
+  }
+
+  @override
+  bool isAvailable() {
+    // TODO: implement isAvailable
+    // TODO: initialize `title` to "Move '$name' to file"
+    // TODO: initialize `defaultFilePath` to a path based on the name of the
+    //  declaration.
+    return false;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index e54709d..6fb64ec 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -24,7 +24,7 @@
 ///
 /// Includes: fields, accessors and methods.
 /// Excludes: constructors and synthetic elements.
-List<Element> getClassMembers(ClassElement clazz, [String? name]) {
+List<Element> getClassMembers(InterfaceElement clazz, [String? name]) {
   var members = <Element>[];
   visitChildren(clazz, (Element element) {
     if (element.isSynthetic) {
@@ -49,7 +49,7 @@
 
 /// Returns a [Set] with direct subclasses of [seed].
 Future<Set<ClassElement>> getDirectSubClasses(
-    SearchEngine searchEngine, ClassElement seed) async {
+    SearchEngine searchEngine, InterfaceElement seed) async {
   var matches = await searchEngine.searchSubtypes(seed);
   return matches.map((match) => match.element).cast<ClassElement>().toSet();
 }
@@ -96,7 +96,7 @@
   if (enclosingElement is ClassElement) {
     var name = member.displayName;
     var searchClasses = [
-      ...enclosingElement.allSupertypes.map((e) => e.element),
+      ...enclosingElement.allSupertypes.map((e) => e.element2),
       enclosingElement,
     ];
     for (var superClass in searchClasses) {
@@ -153,9 +153,9 @@
 /// Includes: fields, accessors and methods.
 ///
 /// Excludes: constructors and synthetic elements.
-List<Element> getMembers(ClassElement clazz) {
+List<Element> getMembers(InterfaceElement clazz) {
   var classElements = [
-    ...clazz.allSupertypes.map((e) => e.element),
+    ...clazz.allSupertypes.map((e) => e.element2),
     clazz,
   ];
   var members = <Element>[];
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index 850822d..71a3321 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -53,8 +53,8 @@
 
   /// Returns all subtypes of the given [type].
   ///
-  /// [type] - the [ClassElement] being subtyped by the found matches.
-  Future<Set<ClassElement>> searchAllSubtypes(ClassElement type);
+  /// [type] - the [InterfaceElement] being subtyped by the found matches.
+  Future<Set<InterfaceElement>> searchAllSubtypes(InterfaceElement type);
 
   /// Returns declarations of class members with the given name.
   ///
@@ -75,7 +75,7 @@
   /// Returns direct subtypes of the given [type].
   ///
   /// [type] - the [ClassElement] being subtyped by the found matches.
-  Future<List<SearchMatch>> searchSubtypes(ClassElement type);
+  Future<List<SearchMatch>> searchSubtypes(InterfaceElement type);
 
   /// Returns all the top-level declarations matching the given pattern.
   ///
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 9ed9114..ea6f36c 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -51,13 +51,13 @@
   }
 
   @override
-  Future<Set<ClassElement>> searchAllSubtypes(ClassElement type) async {
-    var allSubtypes = <ClassElement>{};
+  Future<Set<InterfaceElement>> searchAllSubtypes(InterfaceElement type) async {
+    var allSubtypes = <InterfaceElement>{};
 
-    Future<void> addSubtypes(ClassElement type) async {
+    Future<void> addSubtypes(InterfaceElement type) async {
       var directResults = await _searchDirectSubtypes(type);
       for (var directResult in directResults) {
-        var directSubtype = directResult.enclosingElement as ClassElement;
+        var directSubtype = directResult.enclosingElement as InterfaceElement;
         if (allSubtypes.add(directSubtype)) {
           await addSubtypes(directSubtype);
         }
@@ -106,7 +106,7 @@
   }
 
   @override
-  Future<List<SearchMatch>> searchSubtypes(ClassElement type) async {
+  Future<List<SearchMatch>> searchSubtypes(InterfaceElement type) async {
     var results = await _searchDirectSubtypes(type);
     return results.map(SearchMatchImpl.forSearchResult).toList();
   }
@@ -133,7 +133,8 @@
     return searchedFiles;
   }
 
-  Future<List<SearchResult>> _searchDirectSubtypes(ClassElement type) async {
+  Future<List<SearchResult>> _searchDirectSubtypes(
+      InterfaceElement type) async {
     var allResults = <SearchResult>[];
     var drivers = _drivers.toList();
     var searchedFiles = _createSearchedFiles(drivers);
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index 9255b71..1be0245 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -516,8 +516,12 @@
 
     h3('Pub files');
     buf.writeln('<p>');
+
+    var packageConfig = folder
+        .getChildAssumingFolder(file_paths.dotDartTool)
+        .getChildAssumingFile(file_paths.packageConfigJson);
     buf.writeln(
-        writeOption('Has .packages file', folder.getChild('.packages').exists));
+        writeOption('Has package_config.json file', packageConfig.exists));
     buf.writeln(writeOption('Has pubspec.yaml file',
         folder.getChild(file_paths.pubspecYaml).exists));
     buf.writeln('</p>');
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index 8b034ed..61fbaef 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -41,7 +41,7 @@
       properties['hasNonFinalField'] = element.hasNonFinalField;
       properties['interfaces'] = element.interfaces;
       properties['isAbstract'] = element.isAbstract;
-      properties['isEnum'] = element.isEnum;
+      properties['isEnum'] = element is EnumElement;
       properties['isMixinApplication'] = element.isMixinApplication;
       properties['isValidMixin'] = element.isValidMixin;
       properties['mixins'] = element.mixins;
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
index 85066d4..81ca349 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/completion_request.dart
@@ -15,7 +15,7 @@
   ///
   /// TODO(scheglov) Validate that suggesting a tear-off instead of invocation
   /// is statistically a good choice.
-  bool shouldSuggestTearOff(ClassElement element) {
+  bool shouldSuggestTearOff(InterfaceElement element) {
     if (!libraryElement.featureSet.isEnabled(Feature.constructor_tearoffs)) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index 04f94a6..26d5fb8 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -293,22 +293,22 @@
       return false;
     }
 
-    bool isColorElement(ClassElement element) {
-      bool isExactColor(ClassElement element) =>
+    bool isColorElement(InterfaceElement element) {
+      bool isExactColor(InterfaceElement element) =>
           element.name == 'Color' && element.library.name == 'dart.ui';
 
       if (isExactColor(element)) {
         return true;
       }
       for (var type in element.allSupertypes) {
-        if (isExactColor(type.element)) {
+        if (isExactColor(type.element2)) {
           return true;
         }
       }
       return false;
     }
 
-    return isColorElement(type.element);
+    return isColorElement(type.element2);
   }
 
   /// Return `true` if the given [type] is the flutter mixin `Diagnosticable`
@@ -318,8 +318,8 @@
       return false;
     }
 
-    bool isDiagnosticableElement(ClassElement element) {
-      bool isExactDiagnosticable(ClassElement element) =>
+    bool isDiagnosticableElement(InterfaceElement element) {
+      bool isExactDiagnosticable(InterfaceElement element) =>
           element.name == 'Diagnosticable' &&
           element.source.uri == _uriDiagnostics;
 
@@ -327,14 +327,14 @@
         return true;
       }
       for (var type in element.allSupertypes) {
-        if (isExactDiagnosticable(type.element)) {
+        if (isExactDiagnosticable(type.element2)) {
           return true;
         }
       }
       return false;
     }
 
-    return isDiagnosticableElement(type.element);
+    return isDiagnosticableElement(type.element2);
   }
 
   /// Return `true` if the [element] is the Flutter class `Alignment`.
@@ -349,14 +349,14 @@
   }
 
   /// Return `true` if the [element] is the Flutter class `AlignmentGeometry`.
-  bool isExactAlignmentGeometry(ClassElement element) {
+  bool isExactAlignmentGeometry(InterfaceElement element) {
     return _isExactWidget(element, 'AlignmentGeometry', _uriAlignment);
   }
 
   /// Return `true` if the [type] is the Flutter type `EdgeInsetsGeometry`.
   bool isExactEdgeInsetsGeometryType(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, 'EdgeInsetsGeometry', _uriEdgeInsets);
+        _isExactWidget(type.element2, 'EdgeInsetsGeometry', _uriEdgeInsets);
   }
 
   /// Return `true` if the [node] is creation of `Align`.
@@ -380,13 +380,13 @@
   /// Return `true` if the given [type] is the Flutter class `StatefulWidget`.
   bool isExactlyStatefulWidgetType(DartType? type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameStatefulWidget, _uriFramework);
+        _isExactWidget(type.element2, _nameStatefulWidget, _uriFramework);
   }
 
   /// Return `true` if the given [type] is the Flutter class `StatelessWidget`.
   bool isExactlyStatelessWidgetType(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameStatelessWidget, _uriFramework);
+        _isExactWidget(type.element2, _nameStatelessWidget, _uriFramework);
   }
 
   /// Return `true` if the given [element] is the Flutter class `State`.
@@ -397,43 +397,43 @@
   /// Return `true` if the given [type] is the Flutter class `Align`.
   bool isExactWidgetTypeAlign(DartType? type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameAlign, _uriBasic);
+        _isExactWidget(type.element2, _nameAlign, _uriBasic);
   }
 
   /// Return `true` if the given [type] is the Flutter class `StreamBuilder`.
   bool isExactWidgetTypeBuilder(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameBuilder, _uriBasic);
+        _isExactWidget(type.element2, _nameBuilder, _uriBasic);
   }
 
   /// Return `true` if the given [type] is the Flutter class `Center`.
   bool isExactWidgetTypeCenter(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameCenter, _uriBasic);
+        _isExactWidget(type.element2, _nameCenter, _uriBasic);
   }
 
   /// Return `true` if the given [type] is the Flutter class `Container`.
   bool isExactWidgetTypeContainer(DartType? type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameContainer, _uriContainer);
+        _isExactWidget(type.element2, _nameContainer, _uriContainer);
   }
 
   /// Return `true` if the given [type] is the Flutter class `Padding`.
   bool isExactWidgetTypePadding(DartType? type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _namePadding, _uriBasic);
+        _isExactWidget(type.element2, _namePadding, _uriBasic);
   }
 
   /// Return `true` if the given [type] is the Flutter class `SizedBox`.
   bool isExactWidgetTypeSizedBox(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameSizedBox, _uriBasic);
+        _isExactWidget(type.element2, _nameSizedBox, _uriBasic);
   }
 
   /// Return `true` if the given [type] is the Flutter class `StreamBuilder`.
   bool isExactWidgetTypeStreamBuilder(DartType type) {
     return type is InterfaceType &&
-        _isExactWidget(type.element, _nameStreamBuilder, _uriAsync);
+        _isExactWidget(type.element2, _nameStreamBuilder, _uriAsync);
   }
 
   /// Return `true` if the given [type] is the Flutter class `Widget`, or its
@@ -451,22 +451,22 @@
       return false;
     }
 
-    bool isMatrix4Element(ClassElement element) {
-      bool isExactMatrix4(ClassElement element) =>
+    bool isMatrix4Element(InterfaceElement element) {
+      bool isExactMatrix4(InterfaceElement element) =>
           element.name == 'Matrix4' && element.library.name == 'vector_math_64';
 
       if (isExactMatrix4(element)) {
         return true;
       }
       for (var type in element.allSupertypes) {
-        if (isExactMatrix4(type.element)) {
+        if (isExactMatrix4(type.element2)) {
           return true;
         }
       }
       return false;
     }
 
-    return isMatrix4Element(type.element);
+    return isMatrix4Element(type.element2);
   }
 
   /// Return `true` if the given [element] has the Flutter class `State` as
@@ -494,7 +494,7 @@
       return true;
     }
     for (var type in element.allSupertypes) {
-      if (_isExactWidget(type.element, _nameWidget, _uriFramework)) {
+      if (_isExactWidget(type.element2, _nameWidget, _uriFramework)) {
         return true;
       }
     }
@@ -532,7 +532,7 @@
   /// Return `true` if the given [type] is the Flutter class `Widget`, or its
   /// subtype.
   bool isWidgetType(DartType? type) {
-    return type is InterfaceType && isWidget(type.element);
+    return type is InterfaceType && isWidget(type.element2);
   }
 
   /// Return `true` if the given [element] has a supertype with the
@@ -543,8 +543,8 @@
       return false;
     }
     for (var type in element.allSupertypes) {
-      if (type.element.name == requiredName) {
-        var uri = type.element.source.uri;
+      if (type.element2.name == requiredName) {
+        var uri = type.element2.source.uri;
         if (uri == requiredUri) {
           return true;
         }
diff --git a/pkg/analysis_server/test/services/search/search_engine_test.dart b/pkg/analysis_server/test/services/search/search_engine_test.dart
index 71b35a2..754cb95 100644
--- a/pkg/analysis_server/test/services/search/search_engine_test.dart
+++ b/pkg/analysis_server/test/services/search/search_engine_test.dart
@@ -585,8 +585,14 @@
     }
   }
 
-  static void _assertContainsClass(Set<ClassElement> subtypes, String name) {
-    expect(subtypes, contains(predicate((ClassElement e) => e.name == name)));
+  static void _assertContainsClass(
+      Set<InterfaceElement> subtypes, String name) {
+    expect(
+      subtypes,
+      contains(
+        predicate((InterfaceElement e) => e.name == name),
+      ),
+    );
   }
 }
 
diff --git a/pkg/analysis_server/tool/bulk_fix/parse_utils.dart b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
index 033dc78..ab93c6f 100644
--- a/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
+++ b/pkg/analysis_server/tool/bulk_fix/parse_utils.dart
@@ -32,7 +32,7 @@
         var classElement = classDecl.declaredElement;
         if (classElement != null &&
             classElement.allSupertypes.any(
-                (element) => element.element.name == 'CorrectionProducer')) {
+                (element) => element.element2.name == 'CorrectionProducer')) {
           var correctionName = classDecl.name2.lexeme;
 
           for (var method in classDecl.members.whereType<MethodDeclaration>()) {
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index cf0c112..c651b9e 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -28,11 +28,13 @@
         ClassMemberElement,
         CompilationUnitElement,
         Element,
+        EnumElement,
         ExecutableElement,
         ExtensionElement,
         FieldElement,
         FunctionElement,
         LocalVariableElement,
+        MixinElement,
         ParameterElement,
         PrefixElement,
         TypeParameterElement,
@@ -1711,12 +1713,12 @@
           element is! ExtensionElement) {
         return CompletionGroup.topLevelMember;
       }
-      if (element is ClassElement) {
-        if (element.isEnum) {
-          return CompletionGroup.enumElement;
-        } else if (element.isMixin) {
-          return CompletionGroup.mixinElement;
-        }
+
+      if (element is EnumElement) {
+        return CompletionGroup.enumElement;
+      } else if (element is MixinElement) {
+        return CompletionGroup.mixinElement;
+      } else if (element is ClassElement) {
         if (entity is SimpleIdentifier &&
             entity.parent is NamedType &&
             entity.parent!.parent is ConstructorName &&
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 34fb4a9..d74f7f7 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -22,6 +22,7 @@
         Element,
         ExecutableElement,
         ExtensionElement,
+        InterfaceElement,
         LibraryElement,
         LocalVariableElement,
         ParameterElement,
@@ -1570,7 +1571,7 @@
       return;
     }
     if (targetType is InterfaceType) {
-      var targetClass = targetType.element;
+      var targetClass = targetType.element2;
       var extension = member.thisOrAncestorOfType<ExtensionElement>();
       if (extension != null) {
         _recordDistance('member (extension)', 0);
@@ -1585,19 +1586,23 @@
         /// superclasses caused by mixins.
         int getSuperclassDepth() {
           var depth = 0;
-          ClassElement? currentClass = targetClass;
+          InterfaceElement? currentClass = targetClass;
           while (currentClass != null) {
             if (currentClass == memberClass) {
               return depth;
             }
             for (var mixin in currentClass.mixins.reversed) {
               depth++;
-              if (mixin.element == memberClass) {
+              if (mixin.element2 == memberClass) {
                 return depth;
               }
             }
             depth++;
-            currentClass = currentClass.supertype?.element;
+            if (currentClass is ClassElement) {
+              currentClass = currentClass.supertype?.element2;
+            } else {
+              currentClass = null;
+            }
           }
           return -1;
         }
@@ -1606,10 +1611,14 @@
         /// includes all of the implicit superclasses caused by mixins.
         int getTargetDepth() {
           var depth = 0;
-          ClassElement? currentClass = targetClass;
+          InterfaceElement? currentClass = targetClass;
           while (currentClass != null) {
             depth += currentClass.mixins.length + 1;
-            currentClass = currentClass.supertype?.element;
+            if (currentClass is ClassElement) {
+              currentClass = currentClass.supertype?.element2;
+            } else {
+              break;
+            }
           }
           return depth;
         }
@@ -1816,20 +1825,20 @@
           argumentType is InterfaceType &&
           parameterType is InterfaceType) {
         int distance;
-        if (parameterType.element == typeProvider.futureOrElement) {
+        if (parameterType.element2 == typeProvider.futureOrElement) {
           var typeArgument = parameterType.typeArguments[0];
           distance = featureComputer.inheritanceDistance(
-              argumentType.element, typeProvider.futureElement);
+              argumentType.element2, typeProvider.futureElement);
           if (typeArgument is InterfaceType) {
             var argDistance = featureComputer.inheritanceDistance(
-                argumentType.element, typeArgument.element);
+                argumentType.element2, typeArgument.element2);
             if (distance < 0 || (argDistance >= 0 && argDistance < distance)) {
               distance = argDistance;
             }
           }
         } else {
           distance = featureComputer.inheritanceDistance(
-              argumentType.element, parameterType.element);
+              argumentType.element2, parameterType.element2);
         }
         data.recordDistance('Subtype of context type ($descriptor)', distance);
         data.recordDistance('Subtype of context type (all)', distance);
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 17610dd..49105bc 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -18,6 +18,8 @@
 * Deprecated `Element.enclosingElement2`, use `enclosingElement3` instead.  The meaningful change is that
   `ConstructorElement.enclosingElement3` returns now `IntefaceElement`, not `ClassElement`.
 * Deprecated `get enums/mixin`, use `get enums2/mixins2` instead.
+* Deprecated `DartType.element`, check for `InterfaceType`, `TypeParameterType`, and then ask the element.
+* Deprecated `ClassElement.isEnum` and `isMixin`. Check for `is EnumElement` and `is MixinElement` instead.
 
 ## 4.3.1
 * Fix `identifier` for `LibraryExportElement` and `LibraryImportElement`.
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 76ea504..b389c48 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -82,24 +82,12 @@
 /// The result of applying augmentations to a [ClassElement].
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedClassElement implements AugmentedInterfaceElement {
-  /// Returns mixins applied by this class or in its augmentations.
-  ///
-  /// This is a union of mixins applied by the class declaration and all its
-  /// augmentations.
-  List<InterfaceType> get mixins;
-}
+abstract class AugmentedClassElement implements AugmentedInterfaceElement {}
 
 /// The result of applying augmentations to a [EnumElement].
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class AugmentedEnumElement implements AugmentedInterfaceElement {
-  /// Returns mixins applied by this class or in its augmentations.
-  ///
-  /// This is a union of mixins applied by the class declaration and all its
-  /// augmentations.
-  List<InterfaceType> get mixins;
-}
+abstract class AugmentedEnumElement implements AugmentedInterfaceElement {}
 
 /// The result of applying augmentations to a [InterfaceElement].
 ///
@@ -141,6 +129,12 @@
   /// [MethodElement]s are appended.
   List<MethodElement> get methods;
 
+  /// Returns mixins applied by this class or in its augmentations.
+  ///
+  /// This is a union of mixins applied by the class declaration and all its
+  /// augmentations.
+  List<InterfaceType> get mixins;
+
   /// Returns the unnamed constructor from [constructors].
   ConstructorElement? get unnamedConstructor;
 
@@ -197,18 +191,6 @@
         _TmpSharedClassElement {
   /// Returns the result of applying augmentations to this class.
   AugmentedClassElement get augmented;
-
-  /// Return the superclass of this class, or `null` if either the class
-  /// represents the class 'Object'. If the superclass was not explicitly
-  /// declared then the implicit superclass 'Object' will be returned.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  @override
-  InterfaceType? get supertype;
 }
 
 /// An element that is contained within a [ClassElement].
@@ -1103,10 +1085,6 @@
         _TmpSharedClassElement {
   /// Returns the result of applying augmentations to this element.
   AugmentedEnumElement get augmented;
-
-  /// Returns `Enum` from `dart:core`.
-  @override
-  InterfaceType? get supertype;
 }
 
 /// Shared interface between [EnumElement] and [EnumAugmentationElement].
@@ -1405,6 +1383,23 @@
   /// superclass constraints.
   List<InterfaceType> get allSupertypes;
 
+  /// Return the superclass of this element.
+  ///
+  /// For [ClassElement] returns `null` only if this class is `Object`. If the
+  /// superclass is not explicitly specified, or the superclass cannot be
+  /// resolved, then the implicit superclass `Object` is returned.
+  ///
+  /// For [EnumElement] returns `Enum` from `dart:core`.
+  ///
+  /// For [MixinElement] always returns `null`.
+  ///
+  /// <b>Note:</b> Because the element model represents the state of the code,
+  /// it is possible for it to be semantically invalid. In particular, it is not
+  /// safe to assume that the inheritance structure of a class does not contain
+  /// a cycle. Clients that traverse the inheritance structure must explicitly
+  /// guard against infinite loops.
+  InterfaceType? get supertype;
+
   /// Return the type of `this` expression for this element.
   ///
   /// For a class like `class MyClass<T, U> {}` the returned type is equivalent
@@ -1452,6 +1447,24 @@
     required NullabilitySuffix nullabilitySuffix,
   });
 
+  /// Return the element representing the method that results from looking up
+  /// the given [methodName] in this class with respect to the given [library],
+  /// ignoring abstract methods, or `null` if the look up fails. The behavior of
+  /// this method is defined by the Dart Language Specification in section
+  /// 16.15.1:
+  /// <blockquote>
+  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
+  /// library <i>L</i> is: If <i>C</i> declares an instance method named
+  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
+  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
+  /// result of the lookup is the result of looking up method <i>m</i> in
+  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
+  /// failed.
+  /// </blockquote>
+  /// TODO(scheglov) Deprecate and remove it.
+  MethodElement? lookUpConcreteMethod(
+      String methodName, LibraryElement library);
+
   /// Return the element representing the getter that results from looking up
   /// the given [getterName] in this class with respect to the given [library],
   /// or `null` if the look up fails. The behavior of this method is defined by
@@ -1502,6 +1515,24 @@
   /// </blockquote>
   /// TODO(scheglov) Deprecate and remove it.
   MethodElement? lookUpMethod(String methodName, LibraryElement library);
+
+  /// Return the element representing the setter that results from looking up
+  /// the given [setterName] in this class with respect to the given [library],
+  /// or `null` if the look up fails. The behavior of this method is defined by
+  /// the Dart Language Specification in section 16.15.2:
+  /// <blockquote>
+  /// The result of looking up getter (respectively setter) <i>m</i> in class
+  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
+  /// instance getter (respectively setter) named <i>m</i> that is accessible to
+  /// <i>L</i>, then that getter (respectively setter) is the result of the
+  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
+  /// of the lookup is the result of looking up getter (respectively setter)
+  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
+  /// lookup has failed.
+  /// </blockquote>
+  /// TODO(scheglov) Deprecate and remove it.
+  PropertyAccessorElement? lookUpSetter(
+      String setterName, LibraryElement library);
 }
 
 /// Shared interface between [InterfaceElement] and augmentations.
@@ -1551,6 +1582,10 @@
   /// Return a list containing all of the mixins that are applied to the class
   /// being extended in order to derive the superclass of this class.
   ///
+  /// [ClassElement] and [EnumElement] can have mixins.
+  ///
+  /// [MixinElement] cannot have mixins, so the empty list is returned.
+  ///
   /// <b>Note:</b> Because the element model represents the state of the code,
   /// it is possible for it to be semantically invalid. In particular, it is not
   /// safe to assume that the inheritance structure of a class does not contain
@@ -2454,9 +2489,11 @@
   bool get isDartCoreObject;
 
   /// Return `true` if this class is defined by an enum declaration.
+  @Deprecated('Use `is EnumElement` instead')
   bool get isEnum;
 
   /// Return `true` if this class is defined by a mixin declaration.
+  @Deprecated('Use `is MixinElement` instead')
   bool get isMixin;
 
   /// Return `true` if this class is a mixin application.  A class is a mixin
@@ -2491,37 +2528,6 @@
   /// TODO(scheglov) Deprecate and remove it.
   List<InterfaceType> get superclassConstraints;
 
-  /// Return the superclass of this class, or `null` if either the class
-  /// represents the class 'Object' or if the class represents a mixin
-  /// declaration. All other classes will have a non-`null` superclass. If the
-  /// superclass was not explicitly declared then the implicit superclass
-  /// 'Object' will be returned.
-  ///
-  /// <b>Note:</b> Because the element model represents the state of the code,
-  /// it is possible for it to be semantically invalid. In particular, it is not
-  /// safe to assume that the inheritance structure of a class does not contain
-  /// a cycle. Clients that traverse the inheritance structure must explicitly
-  /// guard against infinite loops.
-  InterfaceType? get supertype;
-
-  /// Return the element representing the method that results from looking up
-  /// the given [methodName] in this class with respect to the given [library],
-  /// ignoring abstract methods, or `null` if the look up fails. The behavior of
-  /// this method is defined by the Dart Language Specification in section
-  /// 16.15.1:
-  /// <blockquote>
-  /// The result of looking up method <i>m</i> in class <i>C</i> with respect to
-  /// library <i>L</i> is: If <i>C</i> declares an instance method named
-  /// <i>m</i> that is accessible to <i>L</i>, then that method is the result of
-  /// the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the
-  /// result of the lookup is the result of looking up method <i>m</i> in
-  /// <i>S</i> with respect to <i>L</i>. Otherwise, we say that the lookup has
-  /// failed.
-  /// </blockquote>
-  /// TODO(scheglov) Deprecate and remove it.
-  MethodElement? lookUpConcreteMethod(
-      String methodName, LibraryElement library);
-
   /// Return the element representing the getter that results from looking up
   /// the given [getterName] in the superclass of this class with respect to the
   /// given [library], ignoring abstract getters, or `null` if the look up
@@ -2577,22 +2583,4 @@
   /// TODO(scheglov) Deprecate and remove it.
   PropertyAccessorElement? lookUpInheritedConcreteSetter(
       String setterName, LibraryElement library);
-
-  /// Return the element representing the setter that results from looking up
-  /// the given [setterName] in this class with respect to the given [library],
-  /// or `null` if the look up fails. The behavior of this method is defined by
-  /// the Dart Language Specification in section 16.15.2:
-  /// <blockquote>
-  /// The result of looking up getter (respectively setter) <i>m</i> in class
-  /// <i>C</i> with respect to library <i>L</i> is: If <i>C</i> declares an
-  /// instance getter (respectively setter) named <i>m</i> that is accessible to
-  /// <i>L</i>, then that getter (respectively setter) is the result of the
-  /// lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result
-  /// of the lookup is the result of looking up getter (respectively setter)
-  /// <i>m</i> in <i>S</i> with respect to <i>L</i>. Otherwise, we say that the
-  /// lookup has failed.
-  /// </blockquote>
-  /// TODO(scheglov) Deprecate and remove it.
-  PropertyAccessorElement? lookUpSetter(
-      String setterName, LibraryElement library);
 }
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index 806186f..c38d702 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -44,6 +44,7 @@
   /// the type has not, or cannot, be associated with an element. The former
   /// case will occur if the element model is not yet complete; the latter case
   /// will occur if this object represents an undefined type.
+  @Deprecated('Check for specific DartType subtype and use element2 instead')
   Element? get element;
 
   /// Return `true` if this type represents the bottom type.
@@ -155,7 +156,7 @@
   ///
   /// For a [TypeParameterType] with a bound (declared or promoted), returns
   /// the interface implemented by the bound.
-  InterfaceType? asInstanceOf(ClassElement element);
+  InterfaceType? asInstanceOf(InterfaceElement element);
 
   /// Return the presentation of this type as it should appear when presented
   /// to users in contexts such as error messages.
@@ -277,9 +278,13 @@
   /// Return a list containing all of the constructors declared in this type.
   List<ConstructorElement> get constructors;
 
+  @Deprecated('Use element2 instead')
   @override
   ClassElement get element;
 
+  /// Return the element representing the declaration of this type.
+  InterfaceElement get element2;
+
   /// Return a list containing all of the interfaces that are implemented by
   /// this interface. Note that this is <b>not</b>, in general, equivalent to
   /// getting the interfaces from this type's element because the types returned
@@ -391,7 +396,10 @@
 }
 
 /// The type `Never` represents the uninhabited bottom type.
-abstract class NeverType implements DartType {}
+abstract class NeverType implements DartType {
+  @override
+  Element get element;
+}
 
 /// A type that can track substituted type parameters, either for itself after
 /// instantiation, or from a surrounding context.
diff --git a/pkg/analyzer/lib/dart/element/type_provider.dart b/pkg/analyzer/lib/dart/element/type_provider.dart
index e75d460..a9d39d9 100644
--- a/pkg/analyzer/lib/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/dart/element/type_provider.dart
@@ -82,7 +82,7 @@
   InterfaceType get mapObjectObjectType;
 
   /// Return the type representing the built-in type `Never`.
-  DartType get neverType;
+  NeverType get neverType;
 
   /// Return the element representing the built-in class `Null`.
   ClassElement get nullElement;
@@ -138,7 +138,7 @@
   InterfaceType futureType(DartType valueType);
 
   /// Return `true` if [element] cannot be extended, implemented, or mixed in.
-  bool isNonSubtypableClass(ClassElement element);
+  bool isNonSubtypableClass(InterfaceElement element);
 
   /// Return 'true' if [id] is the name of a getter on the `Object` type.
   bool isObjectGetter(String id);
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index 5cb89c2..4dc82be 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -299,7 +299,7 @@
             addElementsFrom(parameter.type);
           }
         } else if (type is InterfaceType) {
-          if (elements.add(type.element)) {
+          if (elements.add(type.element2)) {
             for (DartType typeArgument in type.typeArguments) {
               addElementsFrom(typeArgument);
             }
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index e0ab233..b83db32 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -153,7 +153,7 @@
           elementKind == ElementKind.SETTER) {
         var accessor = element as PropertyAccessorElement;
         Element enclosing = element.enclosingElement3;
-        bool isEnumGetter = enclosing is ClassElement && enclosing.isEnum;
+        bool isEnumGetter = enclosing is EnumElement;
         if (isEnumGetter && accessor.name == 'index') {
           kind = IndexSyntheticElementKind.enumIndex;
           element = enclosing;
@@ -168,7 +168,7 @@
         }
       } else if (element is MethodElement) {
         Element enclosing = element.enclosingElement3;
-        bool isEnumMethod = enclosing is ClassElement && enclosing.isEnum;
+        bool isEnumMethod = enclosing is EnumElement;
         if (isEnumMethod && element.name == 'toString') {
           kind = IndexSyntheticElementKind.enumToString;
           element = enclosing;
@@ -563,7 +563,7 @@
     _addSubtypeForClassDeclaration(node);
     var declaredElement = node.declaredElement!;
     if (node.extendsClause == null) {
-      ClassElement? objectElement = declaredElement.supertype?.element;
+      final objectElement = declaredElement.supertype?.element2;
       recordRelationOffset(objectElement, IndexRelationKind.IS_EXTENDED_BY,
           node.name2.offset, 0, true);
     }
@@ -1024,8 +1024,8 @@
     return parent is Combinator || parent is Label;
   }
 
-  void _recordIsAncestorOf(Element descendant, ClassElement ancestor,
-      bool includeThis, List<ClassElement> visitedElements) {
+  void _recordIsAncestorOf(Element descendant, InterfaceElement ancestor,
+      bool includeThis, List<InterfaceElement> visitedElements) {
     if (visitedElements.contains(ancestor)) {
       return;
     }
@@ -1037,21 +1037,26 @@
           ancestor, IndexRelationKind.IS_ANCESTOR_OF, offset, length, false);
     }
     {
-      var superType = ancestor.supertype;
-      if (superType != null) {
-        _recordIsAncestorOf(
-            descendant, superType.element, true, visitedElements);
+      if (ancestor is ClassElement) {
+        var superType = ancestor.supertype;
+        if (superType != null) {
+          _recordIsAncestorOf(
+              descendant, superType.element2, true, visitedElements);
+        }
       }
     }
     for (InterfaceType mixinType in ancestor.mixins) {
-      _recordIsAncestorOf(descendant, mixinType.element, true, visitedElements);
+      _recordIsAncestorOf(
+          descendant, mixinType.element2, true, visitedElements);
     }
-    for (InterfaceType type in ancestor.superclassConstraints) {
-      _recordIsAncestorOf(descendant, type.element, true, visitedElements);
+    if (ancestor is MixinElement) {
+      for (InterfaceType type in ancestor.superclassConstraints) {
+        _recordIsAncestorOf(descendant, type.element2, true, visitedElements);
+      }
     }
     for (InterfaceType implementedType in ancestor.interfaces) {
       _recordIsAncestorOf(
-          descendant, implementedType.element, true, visitedElements);
+          descendant, implementedType.element2, true, visitedElements);
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index 6a385ff..d166d04 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -31,12 +31,18 @@
 }
 
 DeclarationKind? _getSearchElementKind(Element element) {
+  if (element is EnumElement) {
+    return DeclarationKind.ENUM;
+  }
+
+  if (element is MixinElement) {
+    return DeclarationKind.MIXIN;
+  }
+
   if (element is ClassElement) {
-    if (element.isEnum) {
-      return DeclarationKind.ENUM;
+    if (element.isMixinApplication) {
+      return DeclarationKind.CLASS_TYPE_ALIAS;
     }
-    if (element.isMixin) return DeclarationKind.MIXIN;
-    if (element.isMixinApplication) return DeclarationKind.CLASS_TYPE_ALIAS;
     return DeclarationKind.CLASS;
   }
 
@@ -286,7 +292,7 @@
   /// [Search] object, so should be only searched by it to avoid duplicate
   /// results; and updated to take ownership if the file is not owned yet.
   Future<List<SearchResult>> subTypes(
-      ClassElement? type, SearchedFiles searchedFiles) async {
+      InterfaceElement? type, SearchedFiles searchedFiles) async {
     if (type == null) {
       return const <SearchResult>[];
     }
@@ -918,14 +924,12 @@
 
     String? className;
     String? mixinName;
-    if (enclosing is ClassElement) {
-      if (enclosing.isEnum) {
-        // skip
-      } else if (enclosing.isMixin) {
-        mixinName = enclosing.name;
-      } else {
-        className = enclosing.name;
-      }
+    if (enclosing is EnumElement) {
+      // skip
+    } else if (enclosing is MixinElement) {
+      mixinName = enclosing.name;
+    } else if (enclosing is ClassElement) {
+      className = enclosing.name;
     }
 
     var kind = _getSearchElementKind(element);
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index cd5207b..6011235 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -3530,14 +3530,16 @@
   Token semicolon;
 
   /// Initialize a newly created do loop.
-  DoStatementImpl(
-      this.doKeyword,
-      this._body,
-      this.whileKeyword,
-      this.leftParenthesis,
-      this._condition,
-      this.rightParenthesis,
-      this.semicolon) {
+  DoStatementImpl({
+    required this.doKeyword,
+    required StatementImpl body,
+    required this.whileKeyword,
+    required this.leftParenthesis,
+    required ExpressionImpl condition,
+    required this.rightParenthesis,
+    required this.semicolon,
+  })  : _body = body,
+        _condition = condition {
     _becomeParentOf(_body);
     _becomeParentOf(_condition);
   }
@@ -3591,7 +3593,9 @@
   final NodeListImpl<SimpleIdentifier> _components = NodeListImpl._();
 
   /// Initialize a newly created dotted name.
-  DottedNameImpl(List<SimpleIdentifier> components) {
+  DottedNameImpl({
+    required List<SimpleIdentifier> components,
+  }) {
     _components._initialize(this, components);
   }
 
@@ -3636,7 +3640,10 @@
   double value;
 
   /// Initialize a newly created floating point literal.
-  DoubleLiteralImpl(this.literal, this.value);
+  DoubleLiteralImpl({
+    required this.literal,
+    required this.value,
+  });
 
   @override
   Token get beginToken => literal;
@@ -3675,7 +3682,9 @@
   Token semicolon;
 
   /// Initialize a newly created function body.
-  EmptyFunctionBodyImpl(this.semicolon);
+  EmptyFunctionBodyImpl({
+    required this.semicolon,
+  });
 
   @override
   Token get beginToken => semicolon;
@@ -3710,7 +3719,9 @@
   Token semicolon;
 
   /// Initialize a newly created empty statement.
-  EmptyStatementImpl(this.semicolon);
+  EmptyStatementImpl({
+    required this.semicolon,
+  });
 
   @override
   Token get beginToken => semicolon;
@@ -4093,8 +4104,13 @@
   /// Initialize a newly created function body consisting of a block of
   /// statements. The [keyword] can be `null` if the function body is not an
   /// async function body.
-  ExpressionFunctionBodyImpl(this.keyword, this.star, this.functionDefinition,
-      this._expression, this.semicolon) {
+  ExpressionFunctionBodyImpl({
+    required this.keyword,
+    required this.star,
+    required this.functionDefinition,
+    required ExpressionImpl expression,
+    required this.semicolon,
+  }) : _expression = expression {
     _becomeParentOf(_expression);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index e75df71..acd41d7 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -37,53 +37,9 @@
       CommentImpl.createDocumentationCommentWithReferences(
           tokens, references ?? <CommentReference>[]);
 
-  DoStatementImpl doStatement(
-          Token doKeyword,
-          Statement body,
-          Token whileKeyword,
-          Token leftParenthesis,
-          Expression condition,
-          Token rightParenthesis,
-          Token semicolon) =>
-      DoStatementImpl(
-          doKeyword,
-          body as StatementImpl,
-          whileKeyword,
-          leftParenthesis,
-          condition as ExpressionImpl,
-          rightParenthesis,
-          semicolon);
-
-  DottedNameImpl dottedName(List<SimpleIdentifier> components) =>
-      DottedNameImpl(components);
-
-  DoubleLiteralImpl doubleLiteral(Token literal, double value) =>
-      DoubleLiteralImpl(literal, value);
-
-  EmptyFunctionBodyImpl emptyFunctionBody(Token semicolon) =>
-      EmptyFunctionBodyImpl(semicolon);
-
-  EmptyStatementImpl emptyStatement(Token semicolon) =>
-      EmptyStatementImpl(semicolon);
-
   CommentImpl endOfLineComment(List<Token> tokens) =>
       CommentImpl.createEndOfLineComment(tokens);
 
-  ExpressionFunctionBodyImpl expressionFunctionBody(Token? keyword,
-          Token functionDefinition, Expression expression, Token? semicolon) =>
-      ExpressionFunctionBodyImpl(keyword, null, functionDefinition,
-          expression as ExpressionImpl, semicolon);
-
-  ExpressionFunctionBodyImpl expressionFunctionBody2({
-    Token? keyword,
-    Token? star,
-    required Token functionDefinition,
-    required Expression expression,
-    Token? semicolon,
-  }) =>
-      ExpressionFunctionBodyImpl(keyword, star, functionDefinition,
-          expression as ExpressionImpl, semicolon);
-
   ExpressionStatementImpl expressionStatement(
           Expression expression, Token? semicolon) =>
       ExpressionStatementImpl(expression as ExpressionImpl, semicolon);
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index e197e85..ba54b14 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -369,7 +369,7 @@
     }
     // prepare ClassElement
     if (type is InterfaceType) {
-      var element = type.element;
+      var element = type.element2;
       // lookup for ==
       var method = element.lookUpConcreteMethod("==", _currentLibrary);
       if (method == null ||
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 2f0dfe0..ef918ea 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -252,7 +252,7 @@
           var superclass = constant.returnType.superclass;
           if (superclass != null && !superclass.isDartCoreObject) {
             var unnamedConstructor =
-                superclass.element.unnamedConstructor?.declaration;
+                superclass.element2.unnamedConstructor?.declaration;
             if (unnamedConstructor != null && unnamedConstructor.isConst) {
               callback(unnamedConstructor);
             }
@@ -1423,7 +1423,9 @@
   /// [identifier] is "length".
   bool _isStringLength(
       DartObjectImpl targetResult, SimpleIdentifier identifier) {
-    if (targetResult.type.element != _typeProvider.stringElement) {
+    final targetType = targetResult.type;
+    if (!(targetType is InterfaceType &&
+        targetType.element2 == _typeProvider.stringElement)) {
       return false;
     }
     return identifier.name == 'length' &&
diff --git a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
index 2d8db79..5a30ab4 100644
--- a/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
+++ b/pkg/analyzer/lib/src/dart/element/class_hierarchy.dart
@@ -9,13 +9,13 @@
 import 'package:analyzer/src/dart/element/type_system.dart';
 
 class ClassHierarchy {
-  final Map<ClassElement, _Hierarchy> _map = {};
+  final Map<InterfaceElement, _Hierarchy> _map = {};
 
   List<ClassHierarchyError> errors(ClassElement element) {
     return _getHierarchy(element).errors;
   }
 
-  List<InterfaceType> implementedInterfaces(ClassElement element) {
+  List<InterfaceType> implementedInterfaces(InterfaceElement element) {
     return _getHierarchy(element).interfaces;
   }
 
@@ -30,7 +30,7 @@
     });
   }
 
-  _Hierarchy _getHierarchy(ClassElement element) {
+  _Hierarchy _getHierarchy(InterfaceElement element) {
     var hierarchy = _map[element];
 
     if (hierarchy != null) {
@@ -55,7 +55,7 @@
       interfacesMerger.add(type);
 
       var substitution = Substitution.fromInterfaceType(type);
-      var rawInterfaces = implementedInterfaces(type.element);
+      var rawInterfaces = implementedInterfaces(type.element2);
       for (var rawInterface in rawInterfaces) {
         var newInterface =
             substitution.substituteType(rawInterface) as InterfaceType;
@@ -65,9 +65,13 @@
       }
     }
 
-    append(element.supertype);
-    for (var type in element.superclassConstraints) {
-      append(type);
+    if (element is ClassElement) {
+      append(element.supertype);
+    }
+    if (element is MixinElement) {
+      for (var type in element.superclassConstraints) {
+        append(type);
+      }
     }
     for (var type in element.interfaces) {
       append(type);
@@ -114,7 +118,7 @@
 
 class InterfacesMerger {
   final TypeSystemImpl _typeSystem;
-  final _map = <ClassElement, _ClassInterfaceType>{};
+  final Map<InterfaceElement, _ClassInterfaceType> _map = {};
 
   InterfacesMerger(this._typeSystem);
 
@@ -123,7 +127,7 @@
   }
 
   void add(InterfaceType type) {
-    var element = type.element;
+    var element = type.element2;
     var classResult = _map[element];
     if (classResult == null) {
       classResult = _ClassInterfaceType(_typeSystem);
diff --git a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
index d888bd8..3086dfe 100644
--- a/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/display_string_builder.dart
@@ -144,7 +144,7 @@
   }
 
   void writeInterfaceType(InterfaceType type) {
-    _write(type.element.name);
+    _write(type.element2.name);
     _writeTypeArguments(type.typeArguments);
     _writeNullability(type.nullabilitySuffix);
   }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 0c9653e..000d357 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -161,9 +161,11 @@
   @override
   bool get isDartCoreObject => false;
 
+  @Deprecated('Use `is EnumElement` instead')
   @override
   bool get isEnum => false;
 
+  @Deprecated('Use `is MixinElement` instead')
   @override
   bool get isMixin => false;
 
@@ -299,7 +301,7 @@
     required NullabilitySuffix nullabilitySuffix,
   }) {
     return InterfaceTypeImpl(
-      element: this,
+      element2: this,
       typeArguments: typeArguments,
       nullabilitySuffix: nullabilitySuffix,
     );
@@ -436,20 +438,24 @@
   /// Object contains a definition of the getter it will occur last.
   Iterable<PropertyAccessorElement> _implementationsOfGetter(
       String getterName) sync* {
-    ClassElement? classElement = this;
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
+    final visitedClasses = <InterfaceElement>{};
+    InterfaceElement? classElement = this;
     while (classElement != null && visitedClasses.add(classElement)) {
       var getter = classElement.getGetter(getterName);
       if (getter != null) {
         yield getter;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        getter = mixin.element.getGetter(getterName);
+        getter = mixin.element2.getGetter(getterName);
         if (getter != null) {
           yield getter;
         }
       }
-      classElement = classElement.supertype?.element;
+      if (classElement is ClassElement) {
+        classElement = classElement.supertype?.element2;
+      } else {
+        break;
+      }
     }
   }
 
@@ -465,20 +471,24 @@
   /// this class contains a definition of the method it will occur first, if
   /// Object contains a definition of the method it will occur last.
   Iterable<MethodElement> _implementationsOfMethod(String methodName) sync* {
-    ClassElement? classElement = this;
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
+    final visitedClasses = <InterfaceElement>{};
+    InterfaceElement? classElement = this;
     while (classElement != null && visitedClasses.add(classElement)) {
       var method = classElement.getMethod(methodName);
       if (method != null) {
         yield method;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        method = mixin.element.getMethod(methodName);
+        method = mixin.element2.getMethod(methodName);
         if (method != null) {
           yield method;
         }
       }
-      classElement = classElement.supertype?.element;
+      if (classElement is ClassElement) {
+        classElement = classElement.supertype?.element2;
+      } else {
+        break;
+      }
     }
   }
 
@@ -495,20 +505,24 @@
   /// Object contains a definition of the setter it will occur last.
   Iterable<PropertyAccessorElement> _implementationsOfSetter(
       String setterName) sync* {
-    ClassElement? classElement = this;
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
+    final visitedClasses = <InterfaceElement>{};
+    InterfaceElement? classElement = this;
     while (classElement != null && visitedClasses.add(classElement)) {
       var setter = classElement.getSetter(setterName);
       if (setter != null) {
         yield setter;
       }
       for (InterfaceType mixin in classElement.mixins.reversed) {
-        setter = mixin.element.getSetter(setterName);
+        setter = mixin.element2.getSetter(setterName);
         if (setter != null) {
           yield setter;
         }
       }
-      classElement = classElement.supertype?.element;
+      if (classElement is ClassElement) {
+        classElement = classElement.supertype?.element2;
+      } else {
+        break;
+      }
     }
   }
 
@@ -689,11 +703,11 @@
 
   @override
   bool get hasNonFinalField {
-    List<ClassElement> classesToVisit = <ClassElement>[];
-    HashSet<ClassElement> visitedClasses = HashSet<ClassElement>();
+    final classesToVisit = <InterfaceElement>[];
+    final visitedClasses = <InterfaceElement>{};
     classesToVisit.add(this);
     while (classesToVisit.isNotEmpty) {
-      ClassElement currentElement = classesToVisit.removeAt(0);
+      final currentElement = classesToVisit.removeAt(0);
       if (visitedClasses.add(currentElement)) {
         // check fields
         for (FieldElement field in currentElement.fields) {
@@ -706,13 +720,14 @@
         }
         // check mixins
         for (InterfaceType mixinType in currentElement.mixins) {
-          ClassElement mixinElement = mixinType.element;
-          classesToVisit.add(mixinElement);
+          classesToVisit.add(mixinType.element2);
         }
         // check super
-        InterfaceType? supertype = currentElement.supertype;
-        if (supertype != null) {
-          classesToVisit.add(supertype.element);
+        if (currentElement is ClassElement) {
+          final supertype = currentElement.supertype;
+          if (supertype != null) {
+            classesToVisit.add(supertype.element2);
+          }
         }
       }
     }
@@ -763,11 +778,14 @@
   }
 
   @override
-  bool get isDartCoreObject => !isMixin && supertype == null;
+  bool get isDartCoreObject {
+    return name == 'Object' && library.isDartCore;
+  }
 
   bool get isEnumLike {
     // Must be a concrete class.
-    if (isAbstract || isMixin) {
+    // TODO(scheglov) `is MixinElement` after the separation.
+    if (isAbstract || this is MixinElement) {
       return false;
     }
 
@@ -792,7 +810,7 @@
     // No subclasses in the library.
     for (var unit in library.units) {
       for (var class_ in unit.classes) {
-        if (class_.supertype?.element == this) {
+        if (class_.supertype?.element2 == this) {
           return false;
         }
       }
@@ -929,7 +947,7 @@
       return <ConstructorElement>[];
     }
 
-    var superElement = supertype!.element as ClassElementImpl;
+    var superElement = supertype!.element2 as ClassElementImpl;
 
     // First get the list of constructors of the superclass which need to be
     // forwarded to this class.
@@ -975,7 +993,7 @@
         Substitution.fromPairs(superClassParameters, argumentTypes);
 
     bool typeHasInstanceVariables(InterfaceType type) =>
-        type.element.fields.any((e) => !e.isSynthetic);
+        type.element2.fields.any((e) => !e.isSynthetic);
 
     // Now create an implicit constructor for every constructor found above,
     // substituting type parameters as appropriate.
@@ -2992,6 +3010,7 @@
   @override
   bool get isAbstract => false;
 
+  @Deprecated('Use `is EnumElement` instead')
   @override
   bool get isEnum => true;
 
@@ -4952,6 +4971,7 @@
   @override
   bool get isAbstract => true;
 
+  @Deprecated('Use `is MixinElement` instead')
   @override
   bool get isMixin => true;
 
@@ -6342,7 +6362,7 @@
     if (aliasedType_ is! InterfaceType) {
       return false;
     }
-    var aliasedClass = aliasedType_.element;
+    var aliasedClass = aliasedType_.element2;
     var typeArguments = aliasedType_.typeArguments;
     var typeParameterCount = typeParameters.length;
     if (typeParameterCount != aliasedClass.typeParameters.length) {
@@ -6356,7 +6376,9 @@
           !library.typeSystem.isSubtypeOf(aliasedBound, bound)) {
         return false;
       }
-      if (typeParameters[i] != typeArguments[i].element) {
+      final typeArgument = typeArguments[i];
+      if (typeArgument is TypeParameterType &&
+          typeParameters[i] != typeArgument.element) {
         return false;
       }
     }
@@ -6466,7 +6488,7 @@
       );
     } else if (type is InterfaceType) {
       return InterfaceTypeImpl(
-        element: type.element,
+        element2: type.element2,
         typeArguments: type.typeArguments,
         nullabilitySuffix: resultNullability,
         alias: InstantiatedTypeAliasElementImpl(
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 6186e8a..5d58c79 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -21,7 +21,7 @@
       if (element.isGetter) {
         var type = element.returnType;
         if (type is InterfaceType) {
-          interfaceElement = type.element;
+          interfaceElement = type.element2;
         }
       }
     } else if (element is ConstructorElement) {
@@ -41,7 +41,7 @@
           // may have been compiled with a different version of pkg:meta.
           var index = kindObject.getField('index')!.toIntValue()!;
           var targetKindClass =
-              (kindObject.type as InterfaceType).element as EnumElementImpl;
+              (kindObject.type as InterfaceType).element2 as EnumElementImpl;
           // Instead, map constants to their TargetKind by comparing getter
           // names.
           var getter = targetKindClass.constants[index];
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index 4c29923..dc5f480 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -564,7 +564,7 @@
       return;
     }
     if (errorNode is ConstructorName &&
-        !(errorNode.type.type as InterfaceType).element.hasOptionalTypeArgs) {
+        !(errorNode.type.type as InterfaceType).element2.hasOptionalTypeArgs) {
       String constructorName = errorNode.name == null
           ? errorNode.type.name.name
           : '${errorNode.type}.${errorNode.name}';
@@ -592,7 +592,7 @@
         if (element is VariableElement) {
           // For variable elements, we check their type and possible alias type.
           var type = element.type;
-          var typeElement = type.element;
+          final typeElement = type is InterfaceType ? type.element2 : null;
           if (typeElement != null && typeElement.hasOptionalTypeArgs) {
             return;
           }
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 84d0ae4..8819dd6 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -115,7 +115,7 @@
 
   /// Return the result of [getInherited2] with [type] substitution.
   ExecutableElement? getInherited(InterfaceType type, Name name) {
-    var rawElement = getInherited2(type.element, name);
+    var rawElement = getInherited2(type.element2, name);
     if (rawElement == null) {
       return null;
     }
@@ -237,7 +237,7 @@
     bool forSuper = false,
   }) {
     var rawElement = getMember2(
-      type.element,
+      type.element2,
       name,
       concrete: concrete,
       forMixinIndex: forMixinIndex,
@@ -466,7 +466,7 @@
     Interface? superTypeInterface;
     if (superType != null) {
       var substitution = Substitution.fromInterfaceType(superType);
-      superTypeInterface = getInterface(superType.element);
+      superTypeInterface = getInterface(superType.element2);
       _addCandidates(
         namedCandidates: namedCandidates,
         substitution: substitution,
@@ -492,7 +492,7 @@
     // interfaces. Consider using `Map<Name, ExecutableElement>` here.
     var mixinsConflicts = <List<Conflict>>[];
     for (var mixin in element.mixins) {
-      var mixinElement = mixin.element;
+      var mixinElement = mixin.element2;
       var substitution = Substitution.fromInterfaceType(mixin);
       var mixinInterface = getInterface(mixinElement);
       // `class X extends S with M1, M2 {}` is semantically a sequence of:
@@ -583,7 +583,7 @@
       _addCandidates(
         namedCandidates: namedCandidates,
         substitution: Substitution.fromInterfaceType(interface),
-        interface: getInterface(interface.element),
+        interface: getInterface(interface.element2),
         isNonNullableByDefault: isNonNullableByDefault,
       );
     }
@@ -660,7 +660,7 @@
     var superCandidates = <Name, List<ExecutableElement>>{};
     for (var constraint in element.superclassConstraints) {
       var substitution = Substitution.fromInterfaceType(constraint);
-      var interfaceObj = getInterface(constraint.element);
+      var interfaceObj = getInterface(constraint.element2);
       _addCandidates(
         namedCandidates: superCandidates,
         substitution: substitution,
@@ -684,7 +684,7 @@
       _addCandidates(
         namedCandidates: interfaceCandidates,
         substitution: Substitution.fromInterfaceType(interface),
-        interface: getInterface(interface.element),
+        interface: getInterface(interface.element2),
         isNonNullableByDefault: isNonNullableByDefault,
       );
     }
@@ -914,9 +914,10 @@
 
   static bool _isDeclaredInObject(ExecutableElement element) {
     var enclosing = element.enclosingElement3;
+    // TODO(scheglov) `is! MixinElement` after the separation.
     return enclosing is ClassElement &&
         enclosing.supertype == null &&
-        !enclosing.isMixin;
+        enclosing is! MixinElement;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index 544a143..1dfe4b7 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -23,7 +23,7 @@
 /// But it should be used where nullability does not make sense - to specify
 /// superclasses, mixins, and implemented interfaces.
 class InstantiatedClass {
-  final ClassElement element;
+  final InterfaceElement element;
   final List<DartType> arguments;
 
   final Substitution _substitution;
@@ -37,7 +37,7 @@
   /// Return the [InstantiatedClass] that corresponds to the [type] - with the
   /// same element and type arguments, ignoring its nullability suffix.
   factory InstantiatedClass.of(InterfaceType type) {
-    return InstantiatedClass(type.element, type.typeArguments);
+    return InstantiatedClass(type.element2, type.typeArguments);
   }
 
   @override
@@ -70,6 +70,11 @@
   /// Return the superclass of this type, or `null` if this type represents
   /// the class 'Object'.
   InstantiatedClass? get superclass {
+    final element = this.element;
+    if (element is! ClassElement) {
+      return null;
+    }
+
     var supertype = element.supertype;
     if (supertype == null) return null;
 
@@ -83,8 +88,13 @@
   /// the declaration does not have an `on` clause, then the list will contain
   /// the type for the class `Object`.
   List<InstantiatedClass> get superclassConstraints {
-    var constraints = element.superclassConstraints;
-    return _toInstantiatedClasses(constraints);
+    final element = this.element;
+    if (element is MixinElement) {
+      var constraints = element.superclassConstraints;
+      return _toInstantiatedClasses(constraints);
+    } else {
+      return [];
+    }
   }
 
   @visibleForTesting
@@ -126,7 +136,7 @@
 
   InterfaceTypeImpl withNullability(NullabilitySuffix nullability) {
     return InterfaceTypeImpl(
-      element: element,
+      element2: element,
       typeArguments: arguments,
       nullabilitySuffix: nullability,
     );
@@ -190,10 +200,10 @@
       return type1.withNullability(nullability);
     }
 
-    if (type1.element == type2.element) {
+    if (type1.element2 == type2.element2) {
       var args1 = type1.typeArguments;
       var args2 = type2.typeArguments;
-      var params = type1.element.typeParameters;
+      var params = type1.element2.typeParameters;
       assert(args1.length == args2.length);
       assert(args1.length == params.length);
 
@@ -226,7 +236,7 @@
       }
 
       return InterfaceTypeImpl(
-        element: type1.element,
+        element2: type1.element2,
         typeArguments: args,
         nullabilitySuffix: nullability,
       );
@@ -278,8 +288,9 @@
   /// Return the length of the longest inheritance path from the [element] to
   /// Object.
   @visibleForTesting
-  static int computeLongestInheritancePathToObject(ClassElement element) {
-    return _computeLongestInheritancePathToObject(element, <ClassElement>{});
+  static int computeLongestInheritancePathToObject(InterfaceElement element) {
+    return _computeLongestInheritancePathToObject(
+        element, <InterfaceElement>{});
   }
 
   /// Add all of the superinterfaces of the given [type] to the given [set].
@@ -339,9 +350,10 @@
   /// is used to prevent infinite recursion in the case of a cyclic type
   /// structure.
   static int _computeLongestInheritancePathToObject(
-      ClassElement element, Set<ClassElement> visitedElements) {
+      InterfaceElement element, Set<InterfaceElement> visitedElements) {
     // Object case
-    if (element.isDartCoreObject || visitedElements.contains(element)) {
+    if (element is ClassElement && element.isDartCoreObject ||
+        visitedElements.contains(element)) {
       return 0;
     }
     int longestPath = 0;
@@ -350,34 +362,40 @@
 
       // loop through each of the superinterfaces recursively calling this
       // method and keeping track of the longest path to return
-      for (InterfaceType interface in element.superclassConstraints) {
-        var pathLength = _computeLongestInheritancePathToObject(
-            interface.element, visitedElements);
-        longestPath = max(longestPath, 1 + pathLength);
+      if (element is MixinElement) {
+        for (InterfaceType interface in element.superclassConstraints) {
+          var pathLength = _computeLongestInheritancePathToObject(
+              interface.element2, visitedElements);
+          longestPath = max(longestPath, 1 + pathLength);
+        }
       }
 
       // loop through each of the superinterfaces recursively calling this
       // method and keeping track of the longest path to return
       for (InterfaceType interface in element.interfaces) {
         var pathLength = _computeLongestInheritancePathToObject(
-            interface.element, visitedElements);
+            interface.element2, visitedElements);
         longestPath = max(longestPath, 1 + pathLength);
       }
 
+      if (element is! ClassElement) {
+        return longestPath;
+      }
+
       var supertype = element.supertype;
       if (supertype == null) {
         return longestPath;
       }
 
       var superLength = _computeLongestInheritancePathToObject(
-          supertype.element, visitedElements);
+          supertype.element2, visitedElements);
 
       var mixins = element.mixins;
       for (var i = 0; i < mixins.length; i++) {
         // class _X&S&M extends S implements M {}
         // So, we choose the maximum length from S and M.
         var mixinLength = _computeLongestInheritancePathToObject(
-          mixins[i].element,
+          mixins[i].element2,
           visitedElements,
         );
         superLength = max(superLength, mixinLength);
@@ -444,7 +462,7 @@
   LeastUpperBoundHelper(this._typeSystem);
 
   InterfaceType get _interfaceTypeFunctionNone {
-    return _typeSystem.typeProvider.functionType.element.instantiate(
+    return _typeSystem.typeProvider.functionType.element2.instantiate(
       typeArguments: const [],
       nullabilitySuffix: NullabilitySuffix.none,
     );
diff --git a/pkg/analyzer/lib/src/dart/element/normalize.dart b/pkg/analyzer/lib/src/dart/element/normalize.dart
index 52f8639..13d8458 100644
--- a/pkg/analyzer/lib/src/dart/element/normalize.dart
+++ b/pkg/analyzer/lib/src/dart/element/normalize.dart
@@ -139,7 +139,7 @@
 
     // NORM(C<T0, ..., Tn>) = C<R0, ..., Rn> where Ri is NORM(Ti)
     if (T is InterfaceType) {
-      return T.element.instantiate(
+      return T.element2.instantiate(
         typeArguments: T.typeArguments.map(_normalize).toList(),
         nullabilitySuffix: NullabilitySuffix.none,
       );
diff --git a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
index 2db9a85..03cf14f 100644
--- a/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replace_top_bottom_visitor.dart
@@ -113,7 +113,7 @@
   }
 
   DartType _interfaceType(InterfaceType type, Variance variance) {
-    var typeParameters = type.element.typeParameters;
+    var typeParameters = type.element2.typeParameters;
     if (typeParameters.isEmpty) {
       return type;
     }
@@ -128,7 +128,7 @@
     }
 
     return InterfaceTypeImpl(
-      element: type.element,
+      element2: type.element2,
       nullabilitySuffix: type.nullabilitySuffix,
       typeArguments: newTypeArguments,
     );
diff --git a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
index 638ad0f..dc7a09f 100644
--- a/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/element/replacement_visitor.dart
@@ -85,7 +85,7 @@
     }
 
     return InterfaceTypeImpl(
-      element: type.element,
+      element2: type.element2,
       typeArguments: newTypeArguments ?? type.typeArguments,
       nullabilitySuffix: newNullability ?? type.nullabilitySuffix,
       alias: newAlias ?? type.alias,
@@ -372,7 +372,7 @@
     }
 
     var newTypeArguments = _typeArguments(
-      type.element.typeParameters,
+      type.element2.typeParameters,
       type.typeArguments,
     );
 
diff --git a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
index 319da39..a4318bd 100644
--- a/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
+++ b/pkg/analyzer/lib/src/dart/element/runtime_type_equality.dart
@@ -88,7 +88,7 @@
   @override
   bool visitInterfaceType(InterfaceType T1, DartType T2) {
     if (T2 is InterfaceType &&
-        T1.element == T2.element &&
+        T1.element2 == T2.element2 &&
         _compatibleNullability(T1, T2)) {
       var T1_typeArguments = T1.typeArguments;
       var T2_typeArguments = T2.typeArguments;
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index 8bec0b3..2519bcf 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -301,7 +301,7 @@
   }
 
   bool _interfaceArguments(
-    ClassElement element,
+    InterfaceElement element,
     InterfaceType subType,
     InterfaceType superType,
   ) {
@@ -446,8 +446,8 @@
       return false;
     }
 
-    var subElement = subType.element;
-    var superElement = superType.element;
+    var subElement = subType.element2;
+    var superElement = superType.element2;
     if (subElement == superElement) {
       return _interfaceArguments(superElement, subType, superType);
     }
@@ -458,7 +458,7 @@
     }
 
     for (var interface in subElement.allSupertypes) {
-      if (interface.element == superElement) {
+      if (interface.element2 == superElement) {
         var substitution = Substitution.fromInterfaceType(subType);
         var substitutedInterface =
             substitution.substituteType(interface) as InterfaceType;
diff --git a/pkg/analyzer/lib/src/dart/element/top_merge.dart b/pkg/analyzer/lib/src/dart/element/top_merge.dart
index b60f3b1..a340b85 100644
--- a/pkg/analyzer/lib/src/dart/element/top_merge.dart
+++ b/pkg/analyzer/lib/src/dart/element/top_merge.dart
@@ -271,7 +271,7 @@
   }
 
   InterfaceType _interfaceTypes(InterfaceType T, InterfaceType S) {
-    if (T.element != S.element) {
+    if (T.element2 != S.element2) {
       throw _TopMergeStateError(T, S, 'Different class elements');
     }
 
@@ -284,7 +284,7 @@
         T_arguments.length,
         (i) => topMerge(T_arguments[i], S_arguments[i]),
       );
-      return T.element.instantiate(
+      return T.element2.instantiate(
         typeArguments: arguments,
         nullabilitySuffix: NullabilitySuffix.none,
       );
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index b1342b6..b309d49 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -26,6 +26,11 @@
   DynamicTypeImpl._() : super(DynamicElementImpl());
 
   @override
+  Element get element {
+    return super.element!;
+  }
+
+  @override
   int get hashCode => 1;
 
   @override
@@ -426,6 +431,9 @@
 /// A concrete implementation of an [InterfaceType].
 class InterfaceTypeImpl extends TypeImpl implements InterfaceType {
   @override
+  final InterfaceElement element2;
+
+  @override
   final List<DartType> typeArguments;
 
   @override
@@ -441,18 +449,17 @@
   List<MethodElement>? _methods;
 
   InterfaceTypeImpl({
-    required ClassElement element,
+    required this.element2,
     required this.typeArguments,
     required this.nullabilitySuffix,
     InstantiatedTypeAliasElement? alias,
-  }) : super(element, alias: alias) {
-    var typeParameters = element.typeParameters;
+  }) : super(element2 as ClassElement, alias: alias) {
+    var typeParameters = element2.typeParameters;
     if (typeArguments.length != typeParameters.length) {
       throw ArgumentError(
         '[typeParameters.length: ${typeParameters.length}]'
         '[typeArguments.length: ${typeArguments.length}]'
-        '[element: $element]'
-        '[reference: ${element is ClassElementImpl ? element.reference : null}]'
+        '[element: $element2]'
         '[typeParameters: $typeParameters]'
         '[typeArguments: $typeArguments]',
       );
@@ -462,7 +469,7 @@
   @override
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
-      List<PropertyAccessorElement> accessors = element.accessors;
+      List<PropertyAccessorElement> accessors = element2.accessors;
       var members = <PropertyAccessorElement>[];
       for (int i = 0; i < accessors.length; i++) {
         members.add(PropertyAccessorMember.from(accessors[i], this)!);
@@ -475,7 +482,7 @@
   @override
   List<InterfaceType> get allSupertypes {
     var substitution = Substitution.fromInterfaceType(this);
-    return element.allSupertypes
+    return element2.allSupertypes
         .map((t) => substitution.substituteType(t) as InterfaceType)
         .toList();
   }
@@ -483,7 +490,7 @@
   @override
   List<ConstructorElement> get constructors {
     if (_constructors == null) {
-      List<ConstructorElement> constructors = element.constructors;
+      List<ConstructorElement> constructors = element2.constructors;
       var members = <ConstructorElement>[];
       for (int i = 0; i < constructors.length; i++) {
         members.add(ConstructorMember.from(constructors[i], this));
@@ -493,108 +500,110 @@
     return _constructors!;
   }
 
+  @Deprecated('Check for specific DartType subtype and use element2 instead')
   @override
   ClassElement get element => super.element as ClassElement;
 
   @override
   int get hashCode {
-    return element.hashCode;
+    return element2.hashCode;
   }
 
   @override
   List<InterfaceType> get interfaces {
-    return _instantiateSuperTypes(element.interfaces);
+    return _instantiateSuperTypes(element2.interfaces);
   }
 
   @override
   bool get isDartAsyncFuture {
-    return element.name == "Future" && element.library.isDartAsync;
+    return element2.name == "Future" && element2.library.isDartAsync;
   }
 
   @override
   bool get isDartAsyncFutureOr {
-    return element.name == "FutureOr" && element.library.isDartAsync;
+    return element2.name == "FutureOr" && element2.library.isDartAsync;
   }
 
   @override
   bool get isDartAsyncStream {
-    return element.name == "Stream" && element.library.isDartAsync;
+    return element2.name == "Stream" && element2.library.isDartAsync;
   }
 
   @override
   bool get isDartCoreBool {
-    return element.name == "bool" && element.library.isDartCore;
+    return element2.name == "bool" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreDouble {
-    return element.name == "double" && element.library.isDartCore;
+    return element2.name == "double" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreEnum {
-    return element.isDartCoreEnum;
+    final element2 = this.element2;
+    return element2 is ClassElement && element2.isDartCoreEnum;
   }
 
   @override
   bool get isDartCoreFunction {
-    return element.name == "Function" && element.library.isDartCore;
+    return element2.name == "Function" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreInt {
-    return element.name == "int" && element.library.isDartCore;
+    return element2.name == "int" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreIterable {
-    return element.name == "Iterable" && element.library.isDartCore;
+    return element2.name == "Iterable" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreList {
-    return element.name == "List" && element.library.isDartCore;
+    return element2.name == "List" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreMap {
-    return element.name == "Map" && element.library.isDartCore;
+    return element2.name == "Map" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreNull {
-    return element.name == "Null" && element.library.isDartCore;
+    return element2.name == "Null" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreNum {
-    return element.name == "num" && element.library.isDartCore;
+    return element2.name == "num" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreObject {
-    return element.name == "Object" && element.library.isDartCore;
+    return element2.name == "Object" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreSet {
-    return element.name == "Set" && element.library.isDartCore;
+    return element2.name == "Set" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreString {
-    return element.name == "String" && element.library.isDartCore;
+    return element2.name == "String" && element2.library.isDartCore;
   }
 
   @override
   bool get isDartCoreSymbol {
-    return element.name == "Symbol" && element.library.isDartCore;
+    return element2.name == "Symbol" && element2.library.isDartCore;
   }
 
   @override
   List<MethodElement> get methods {
     if (_methods == null) {
-      List<MethodElement> methods = element.methods;
+      List<MethodElement> methods = element2.methods;
       var members = <MethodElement>[];
       for (int i = 0; i < methods.length; i++) {
         members.add(MethodMember.from(methods[i], this)!);
@@ -606,7 +615,7 @@
 
   @override
   List<InterfaceType> get mixins {
-    List<InterfaceType> mixins = element.mixins;
+    List<InterfaceType> mixins = element2.mixins;
     return _instantiateSuperTypes(mixins);
   }
 
@@ -616,7 +625,7 @@
 
   @override
   InterfaceType? get superclass {
-    var supertype = element.supertype;
+    var supertype = element2.supertype;
     if (supertype == null) {
       return null;
     }
@@ -627,12 +636,17 @@
 
   @override
   List<InterfaceType> get superclassConstraints {
-    List<InterfaceType> constraints = element.superclassConstraints;
-    return _instantiateSuperTypes(constraints);
+    final element2 = this.element2;
+    if (element2 is MixinElement) {
+      final constraints = element2.superclassConstraints;
+      return _instantiateSuperTypes(constraints);
+    } else {
+      return [];
+    }
   }
 
   InheritanceManager3 get _inheritanceManager =>
-      (element.library.session as AnalysisSessionImpl).inheritanceManager;
+      (element2.library.session as AnalysisSessionImpl).inheritanceManager;
 
   @override
   bool operator ==(Object other) {
@@ -643,7 +657,7 @@
       if (other.nullabilitySuffix != nullabilitySuffix) {
         return false;
       }
-      return other.element == element &&
+      return other.element2 == element2 &&
           TypeImpl.equalArrays(other.typeArguments, typeArguments);
     }
     return false;
@@ -668,13 +682,13 @@
   }
 
   @override
-  InterfaceType? asInstanceOf(ClassElement targetElement) {
-    if (element == targetElement) {
+  InterfaceType? asInstanceOf(InterfaceElement targetElement) {
+    if (element2 == targetElement) {
       return this;
     }
 
-    for (var rawInterface in element.allSupertypes) {
-      if (rawInterface.element == targetElement) {
+    for (var rawInterface in element2.allSupertypes) {
+      if (rawInterface.element2 == targetElement) {
         var substitution = Substitution.fromInterfaceType(this);
         return substitution.substituteType(rawInterface) as InterfaceType;
       }
@@ -685,15 +699,15 @@
 
   @override
   PropertyAccessorElement? getGetter(String getterName) =>
-      PropertyAccessorMember.from(element.getGetter(getterName), this);
+      PropertyAccessorMember.from(element2.getGetter(getterName), this);
 
   @override
   MethodElement? getMethod(String methodName) =>
-      MethodMember.from(element.getMethod(methodName), this);
+      MethodMember.from(element2.getMethod(methodName), this);
 
   @override
   PropertyAccessorElement? getSetter(String setterName) =>
-      PropertyAccessorMember.from(element.getSetter(setterName), this);
+      PropertyAccessorMember.from(element2.getSetter(setterName), this);
 
   @override
   ConstructorElement? lookUpConstructor(
@@ -701,9 +715,9 @@
     // prepare base ConstructorElement
     ConstructorElement? constructorElement;
     if (constructorName == null) {
-      constructorElement = element.unnamedConstructor;
+      constructorElement = element2.unnamedConstructor;
     } else {
-      constructorElement = element.getNamedConstructor(constructorName);
+      constructorElement = element2.getNamedConstructor(constructorName);
     }
     // not found or not accessible
     if (constructorElement == null ||
@@ -746,8 +760,8 @@
     }
 
     if (recoveryStatic) {
-      final element = this.element as AbstractClassElementImpl;
-      return element.lookupStaticGetter(name, library);
+      final element2 = this.element2 as AbstractClassElementImpl;
+      return element2.lookupStaticGetter(name, library);
     }
 
     return null;
@@ -785,8 +799,8 @@
     }
 
     if (recoveryStatic) {
-      final element = this.element as AbstractClassElementImpl;
-      return element.lookupStaticMethod(name, library);
+      final element2 = this.element2 as AbstractClassElementImpl;
+      return element2.lookupStaticMethod(name, library);
     }
 
     return null;
@@ -824,8 +838,8 @@
     }
 
     if (recoveryStatic) {
-      final element = this.element as AbstractClassElementImpl;
-      return element.lookupStaticSetter(name, library);
+      final element2 = this.element2 as AbstractClassElementImpl;
+      return element2.lookupStaticSetter(name, library);
     }
 
     return null;
@@ -844,7 +858,7 @@
     if (this.nullabilitySuffix == nullabilitySuffix) return this;
 
     return InterfaceTypeImpl(
-      element: element,
+      element2: element2,
       typeArguments: typeArguments,
       nullabilitySuffix: nullabilitySuffix,
     );
@@ -853,7 +867,7 @@
   List<InterfaceType> _instantiateSuperTypes(List<InterfaceType> defined) {
     if (defined.isEmpty) return defined;
 
-    var typeParameters = element.typeParameters;
+    var typeParameters = element2.typeParameters;
     if (typeParameters.isEmpty) return defined;
 
     var substitution = Substitution.fromInterfaceType(this);
@@ -1041,7 +1055,7 @@
   void appendTo(ElementDisplayStringBuilder builder);
 
   @override
-  InterfaceType? asInstanceOf(ClassElement targetElement) => null;
+  InterfaceType? asInstanceOf(InterfaceElement targetElement) => null;
 
   @override
   String getDisplayString({
@@ -1191,7 +1205,7 @@
   }
 
   @override
-  InterfaceType? asInstanceOf(ClassElement targetElement) {
+  InterfaceType? asInstanceOf(InterfaceElement targetElement) {
     return bound.asInstanceOf(targetElement);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index 621f2c8..5635c6c 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -183,7 +183,7 @@
     if (type.typeArguments.isEmpty) {
       return _NullSubstitution.instance;
     }
-    return fromPairs(type.element.typeParameters, type.typeArguments);
+    return fromPairs(type.element2.typeParameters, type.typeArguments);
   }
 
   /// Substitutes each parameter to the type it maps to in [map].
@@ -514,7 +514,7 @@
     }
 
     return InterfaceTypeImpl(
-      element: type.element,
+      element2: type.element2,
       typeArguments: typeArguments,
       nullabilitySuffix: type.nullabilitySuffix,
       alias: alias,
diff --git a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
index f5b011e..95cebcf 100644
--- a/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_constraint_gatherer.dart
@@ -543,7 +543,7 @@
     // holds under constraints `C0 + ... + Ck`:
     //   If `Mi` is a subtype match for `Ni` with respect to L under
     //   constraints `Ci`.
-    if (P.element == Q.element) {
+    if (P.element2 == Q.element2) {
       if (!_interfaceType_arguments(P, Q, leftSchema)) {
         return false;
       }
@@ -555,10 +555,10 @@
     //   If `C1<B0, ..., Bj>` is a superinterface of `C0<M0, ..., Mk>` and
     //   `C1<B0, ..., Bj>` is a subtype match for `C1<N0, ..., Nj>` with
     //   respect to `L` under constraints `C`.
-    var C0 = P.element;
-    var C1 = Q.element;
+    var C0 = P.element2;
+    var C1 = Q.element2;
     for (var interface in C0.allSupertypes) {
-      if (interface.element == C1) {
+      if (interface.element2 == C1) {
         var substitution = Substitution.fromInterfaceType(P);
         return _interfaceType_arguments(
           substitution.substituteType(interface) as InterfaceType,
@@ -578,13 +578,13 @@
     InterfaceType Q,
     bool leftSchema,
   ) {
-    assert(P.element == Q.element);
+    assert(P.element2 == Q.element2);
 
     var rewind = _constraints.length;
 
     for (var i = 0; i < P.typeArguments.length; i++) {
       var variance =
-          (P.element.typeParameters[i] as TypeParameterElementImpl).variance;
+          (P.element2.typeParameters[i] as TypeParameterElementImpl).variance;
       var M = P.typeArguments[i];
       var N = Q.typeArguments[i];
       if ((variance.isCovariant || variance.isInvariant) &&
diff --git a/pkg/analyzer/lib/src/dart/element/type_provider.dart b/pkg/analyzer/lib/src/dart/element/type_provider.dart
index 26d915f..9e23e3d 100644
--- a/pkg/analyzer/lib/src/dart/element/type_provider.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_provider.dart
@@ -79,7 +79,7 @@
 abstract class TypeProviderBase implements TypeProvider {
   @override
   bool isObjectGetter(String id) {
-    var element = objectType.element.getGetter(id);
+    var element = objectType.element2.getGetter(id);
     return element != null && !element.isStatic;
   }
 
@@ -90,7 +90,7 @@
 
   @override
   bool isObjectMethod(String id) {
-    var element = objectType.element.getMethod(id);
+    var element = objectType.element2.getMethod(id);
     return element != null && !element.isStatic;
   }
 }
@@ -238,7 +238,7 @@
       var element = enumElement;
       if (element != null) {
         _enumType = InterfaceTypeImpl(
-          element: element,
+          element2: element,
           typeArguments: const [],
           nullabilitySuffix: _nullabilitySuffix,
         );
@@ -255,7 +255,7 @@
   @override
   InterfaceType get futureDynamicType {
     return _futureDynamicType ??= InterfaceTypeImpl(
-      element: futureElement,
+      element2: futureElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -269,7 +269,7 @@
   @override
   InterfaceType get futureNullType {
     return _futureNullType ??= InterfaceTypeImpl(
-      element: futureElement,
+      element2: futureElement,
       typeArguments: [nullType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -283,7 +283,7 @@
   @override
   InterfaceType get futureOrNullType {
     return _futureOrNullType ??= InterfaceTypeImpl(
-      element: futureOrElement,
+      element2: futureOrElement,
       typeArguments: [nullType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -306,7 +306,7 @@
   @override
   InterfaceType get iterableDynamicType {
     return _iterableDynamicType ??= InterfaceTypeImpl(
-      element: iterableElement,
+      element2: iterableElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -320,7 +320,7 @@
   @override
   InterfaceType get iterableObjectType {
     return _iterableObjectType ??= InterfaceTypeImpl(
-      element: iterableElement,
+      element2: iterableElement,
       typeArguments: [objectType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -339,14 +339,14 @@
   @override
   InterfaceType get mapObjectObjectType {
     return _mapObjectObjectType ??= InterfaceTypeImpl(
-      element: mapElement,
+      element2: mapElement,
       typeArguments: [objectType, objectType],
       nullabilitySuffix: _nullabilitySuffix,
     );
   }
 
   @override
-  DartType get neverType => isNonNullableByDefault
+  NeverType get neverType => isNonNullableByDefault
       ? NeverTypeImpl.instance
       : NeverTypeImpl.instanceLegacy;
 
@@ -403,7 +403,7 @@
   @override
   InterfaceType get streamDynamicType {
     return _streamDynamicType ??= InterfaceTypeImpl(
-      element: streamElement,
+      element2: streamElement,
       typeArguments: [dynamicType],
       nullabilitySuffix: _nullabilitySuffix,
     );
@@ -467,7 +467,7 @@
   }
 
   @override
-  bool isNonSubtypableClass(ClassElement element) {
+  bool isNonSubtypableClass(InterfaceElement element) {
     var name = element.name;
     if (_nonSubtypableClassNames.contains(name)) {
       var libraryUriStr = element.library.source.uri.toString();
@@ -544,7 +544,7 @@
     }
 
     return InterfaceTypeImpl(
-      element: element,
+      element2: element,
       typeArguments: typeArguments,
       nullabilitySuffix: _nullabilitySuffix,
     );
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index eaff897..4657129 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -318,7 +318,7 @@
   List<InterfaceType> gatherMixinSupertypeConstraintsForInference(
       ClassElement mixinElement) {
     List<InterfaceType> candidates;
-    if (mixinElement.isMixin) {
+    if (mixinElement is MixinElement) {
       candidates = mixinElement.superclassConstraints;
     } else {
       final supertype = mixinElement.supertype;
@@ -332,7 +332,7 @@
       }
     }
     return candidates
-        .where((type) => type.element.typeParameters.isNotEmpty)
+        .where((type) => type.element2.typeParameters.isNotEmpty)
         .toList();
   }
 
@@ -345,7 +345,7 @@
   FunctionType? getCallMethodType(DartType t) {
     if (t is InterfaceType) {
       return t
-          .lookUpMethod2(FunctionElement.CALL_METHOD_NAME, t.element.library)
+          .lookUpMethod2(FunctionElement.CALL_METHOD_NAME, t.element2.library)
           ?.type;
     }
     return null;
@@ -555,7 +555,7 @@
       return type.instantiate(typeArguments);
     } else if (type is InterfaceTypeImpl) {
       // TODO(scheglov) Use `ClassElement.instantiate()`, don't use raw types.
-      return type.element.instantiate(
+      return type.element2.instantiate(
         typeArguments: typeArguments,
         nullabilitySuffix: type.nullabilitySuffix,
       );
@@ -1595,7 +1595,7 @@
     if (type is FunctionType) {
       return type.typeFormals;
     } else if (type is InterfaceType) {
-      return type.element.typeParameters;
+      return type.element2.typeParameters;
     } else {
       return const <TypeParameterElement>[];
     }
diff --git a/pkg/analyzer/lib/src/dart/element/well_bounded.dart b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
index 9ca8629..7eada0f 100644
--- a/pkg/analyzer/lib/src/dart/element/well_bounded.dart
+++ b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
@@ -84,8 +84,8 @@
       typeParameters = alias.element.typeParameters;
       typeArguments = alias.typeArguments;
     } else if (type is InterfaceType) {
-      elementName = type.element.name;
-      typeParameters = type.element.typeParameters;
+      elementName = type.element2.name;
+      typeParameters = type.element2.typeParameters;
       typeArguments = type.typeArguments;
     } else {
       return const RegularBoundedTypeResult._();
diff --git a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
index e50459e..5ff4980 100644
--- a/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/annotation_resolver.dart
@@ -374,7 +374,7 @@
     ExecutableElement? getter;
     var aliasedType = typeAliasElement.aliasedType;
     if (aliasedType is InterfaceType) {
-      var classElement = aliasedType.element;
+      var classElement = aliasedType.element2;
       if (getterName != null) {
         getter = classElement.getGetter(getterName.name);
         getter = _resolver.toLegacyElement(getter);
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
index 4d6e6c5..3d5ffca 100644
--- a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -184,7 +184,7 @@
             node: node,
             typeIdentifier: target,
             constructorIdentifier: methodName,
-            classElement: aliasedType.element,
+            classElement: aliasedType.element2,
           );
         }
       }
@@ -209,7 +209,7 @@
               node: node,
               typeNameIdentifier: target,
               constructorIdentifier: methodName,
-              classElement: aliasedType.element,
+              classElement: aliasedType.element2,
             );
           }
         }
@@ -262,7 +262,9 @@
         //     typedef X = C;
         //     X.named
         return _toConstructorReference_prefixed(
-            node: node, classElement: aliasedType.element);
+          node: node,
+          classElement: aliasedType.element2,
+        );
       }
     }
     return node;
@@ -350,7 +352,7 @@
           node: node,
           receiver: receiverIdentifier,
           typeArguments: typeArguments,
-          classElement: aliasedType.element,
+          classElement: aliasedType.element2,
         );
       }
     }
@@ -374,7 +376,7 @@
     required MethodInvocationImpl node,
     required PrefixedIdentifierImpl typeNameIdentifier,
     required SimpleIdentifierImpl constructorIdentifier,
-    required ClassElement classElement,
+    required InterfaceElement classElement,
   }) {
     var constructorElement = classElement.getNamedConstructor(
       constructorIdentifier.name,
@@ -408,7 +410,7 @@
 
   AstNode _toConstructorReference_prefixed({
     required PrefixedIdentifierImpl node,
-    required ClassElement classElement,
+    required InterfaceElement classElement,
   }) {
     var name = node.identifier.name;
     var constructorElement = name == 'new'
@@ -435,7 +437,7 @@
     required PropertyAccessImpl node,
     required IdentifierImpl receiver,
     required TypeArgumentListImpl? typeArguments,
-    required ClassElement classElement,
+    required InterfaceElement classElement,
   }) {
     var name = node.propertyName.name;
     var constructorElement = name == 'new'
@@ -514,7 +516,7 @@
     required MethodInvocationImpl node,
     required SimpleIdentifierImpl typeIdentifier,
     required SimpleIdentifierImpl constructorIdentifier,
-    required ClassElement classElement,
+    required InterfaceElement classElement,
   }) {
     var name = constructorIdentifier.name;
     var constructorElement = classElement.getNamedConstructor(name);
diff --git a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
index 0e5cbf2..4006686 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -53,7 +53,9 @@
       // to avoid reporting redundant errors.
       var enclosingElement = node.constructorName.type.name.staticElement;
       if (enclosingElement is TypeAliasElement) {
-        enclosingElement = enclosingElement.aliasedType.element;
+        final aliasedType = enclosingElement.aliasedType;
+        enclosingElement =
+            aliasedType is InterfaceType ? aliasedType.element2 : null;
       }
       // TODO(srawlins): Handle `enclosingElement` being a function typedef:
       // typedef F<T> = void Function(); var a = F<int>.extensionOnType;`.
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index d746b4b..5853ab1 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -164,7 +164,7 @@
     // Otherwise, a 'call' method on the interface, or on an applicable
     // extension method applies.
     return type.lookUpMethod2(
-            FunctionElement.CALL_METHOD_NAME, type.element.library) ??
+            FunctionElement.CALL_METHOD_NAME, type.element2.library) ??
         _extensionResolver
             .findExtension(type, node, FunctionElement.CALL_METHOD_NAME)
             .getter;
@@ -211,7 +211,7 @@
           nameNode.name,
           element.kind.displayName,
           enclosingElement.name!,
-          enclosingElement is ClassElement && enclosingElement.isMixin
+          enclosingElement is MixinElement
               ? 'mixin'
               : enclosingElement.kind.displayName,
         ],
@@ -777,7 +777,7 @@
   /// Returns the element that represents the property named [propertyName] on
   /// [classElement].
   ExecutableElement? _resolveStaticElement(
-      ClassElement classElement, SimpleIdentifier propertyName) {
+      InterfaceElement classElement, SimpleIdentifier propertyName) {
     String name = propertyName.name;
     ExecutableElement? element;
     if (propertyName.inSetterContext()) {
@@ -846,7 +846,7 @@
       } else if (receiverElement is TypeAliasElement) {
         var aliasedType = receiverElement.aliasedType;
         if (aliasedType is InterfaceType) {
-          var element = _resolveStaticElement(aliasedType.element, name);
+          var element = _resolveStaticElement(aliasedType.element2, name);
           name.staticElement = element;
           return element?.referenceType;
         } else {
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 0f67ceec..78dbe74 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -143,7 +143,7 @@
         var aliasedType = element.aliasedType;
         if (aliasedType is InterfaceType) {
           _resolveReceiverTypeLiteral(
-              node, aliasedType.element, nameNode, name, whyNotPromotedList,
+              node, aliasedType.element2, nameNode, name, whyNotPromotedList,
               contextType: contextType);
           return;
         }
@@ -256,7 +256,7 @@
           nameNode.name,
           element.kind.displayName,
           enclosingElement.name!,
-          enclosingElement is ClassElement && enclosingElement.isMixin
+          enclosingElement is MixinElement
               ? 'mixin'
               : enclosingElement.kind.displayName,
         ],
@@ -347,7 +347,7 @@
   /// Given that we are accessing a property of the given [classElement] with the
   /// given [propertyName], return the element that represents the property.
   Element? _resolveElement(
-      ClassElement classElement, SimpleIdentifier propertyName) {
+      InterfaceElement classElement, SimpleIdentifier propertyName) {
     // TODO(scheglov) Replace with class hierarchy.
     String name = propertyName.name;
     Element? element;
@@ -819,7 +819,7 @@
 
     String receiverClassName = '<unknown>';
     if (receiverType is InterfaceType) {
-      receiverClassName = receiverType.element.name;
+      receiverClassName = receiverType.element2.name;
     } else if (receiverType is FunctionType) {
       receiverClassName = 'Function';
     }
@@ -835,13 +835,13 @@
 
   void _resolveReceiverTypeLiteral(
       MethodInvocationImpl node,
-      ClassElement receiver,
+      InterfaceElement receiver,
       SimpleIdentifierImpl nameNode,
       String name,
       List<WhyNotPromotedGetter> whyNotPromotedList,
       {required DartType? contextType}) {
     if (node.isCascaded) {
-      receiver = _typeType.element;
+      receiver = _typeType.element2;
     }
 
     var element = _resolveElement(receiver, nameNode);
diff --git a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
index 362b8a7..7b87b03 100644
--- a/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/named_type_resolver.dart
@@ -237,7 +237,7 @@
     if (element is ClassElement) {
       if (identical(node, withClause_namedType)) {
         for (var mixin in enclosingClass!.mixins) {
-          if (mixin.element == element) {
+          if (mixin.element2 == element) {
             return mixin;
           }
         }
diff --git a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
index 082e7fb..6b212e3 100644
--- a/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/property_element_resolver.dart
@@ -312,7 +312,7 @@
             propertyName.name,
             element.kind.displayName,
             enclosingElement.name!,
-            enclosingElement is ClassElement && enclosingElement.isMixin
+            enclosingElement is MixinElement
                 ? 'mixin'
                 : enclosingElement.kind.displayName,
           ]);
@@ -370,7 +370,7 @@
     if (target is Identifier) {
       var targetElement = target.staticElement;
       if (targetElement is ClassElement) {
-        return _resolveTargetClassElement(
+        return _resolveTargetInterfaceElement(
           typeReference: targetElement,
           isCascaded: isCascaded,
           propertyName: propertyName,
@@ -380,8 +380,8 @@
       } else if (targetElement is TypeAliasElement) {
         var aliasedType = targetElement.aliasedType;
         if (aliasedType is InterfaceType) {
-          return _resolveTargetClassElement(
-            typeReference: aliasedType.element,
+          return _resolveTargetInterfaceElement(
+            typeReference: aliasedType.element2,
             isCascaded: isCascaded,
             propertyName: propertyName,
             hasRead: hasRead,
@@ -495,87 +495,6 @@
     );
   }
 
-  PropertyElementResolverResult _resolveTargetClassElement({
-    required ClassElement typeReference,
-    required bool isCascaded,
-    required SimpleIdentifier propertyName,
-    required bool hasRead,
-    required bool hasWrite,
-  }) {
-    if (isCascaded) {
-      typeReference = _resolver.typeProvider.typeType.element;
-    }
-
-    ExecutableElement? readElement;
-    ExecutableElement? readElementRecovery;
-    if (hasRead) {
-      readElement = typeReference.getGetter(propertyName.name);
-      if (readElement != null && !_isAccessible(readElement)) {
-        readElement = null;
-      }
-
-      if (readElement == null) {
-        readElement = typeReference.getMethod(propertyName.name);
-        if (readElement != null && !_isAccessible(readElement)) {
-          readElement = null;
-        }
-      }
-
-      if (readElement != null) {
-        readElement = _resolver.toLegacyElement(readElement);
-        if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
-          readElementRecovery = readElement;
-          readElement = null;
-        }
-      } else {
-        var code = typeReference.isEnum
-            ? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
-            : CompileTimeErrorCode.UNDEFINED_GETTER;
-        errorReporter.reportErrorForNode(
-          code,
-          propertyName,
-          [propertyName.name, typeReference.name],
-        );
-      }
-    }
-
-    ExecutableElement? writeElement;
-    ExecutableElement? writeElementRecovery;
-    if (hasWrite) {
-      writeElement = typeReference.getSetter(propertyName.name);
-      if (writeElement != null) {
-        writeElement = _resolver.toLegacyElement(writeElement);
-        if (!_isAccessible(writeElement)) {
-          errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.PRIVATE_SETTER,
-            propertyName,
-            [propertyName.name],
-          );
-        }
-        if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
-          writeElementRecovery = writeElement;
-          writeElement = null;
-        }
-      } else {
-        // Recovery, try to use getter.
-        writeElementRecovery = typeReference.getGetter(propertyName.name);
-        AssignmentVerifier(_definingLibrary, errorReporter).verify(
-          node: propertyName,
-          requested: null,
-          recovery: writeElementRecovery,
-          receiverType: typeReference.thisType,
-        );
-      }
-    }
-
-    return PropertyElementResolverResult(
-      readElementRequested: readElement,
-      readElementRecovery: readElementRecovery,
-      writeElementRequested: writeElement,
-      writeElementRecovery: writeElementRecovery,
-    );
-  }
-
   PropertyElementResolverResult _resolveTargetExtensionElement({
     required ExtensionElement extension,
     required SimpleIdentifier propertyName,
@@ -696,6 +615,87 @@
     );
   }
 
+  PropertyElementResolverResult _resolveTargetInterfaceElement({
+    required InterfaceElement typeReference,
+    required bool isCascaded,
+    required SimpleIdentifier propertyName,
+    required bool hasRead,
+    required bool hasWrite,
+  }) {
+    if (isCascaded) {
+      typeReference = _resolver.typeProvider.typeType.element2;
+    }
+
+    ExecutableElement? readElement;
+    ExecutableElement? readElementRecovery;
+    if (hasRead) {
+      readElement = typeReference.getGetter(propertyName.name);
+      if (readElement != null && !_isAccessible(readElement)) {
+        readElement = null;
+      }
+
+      if (readElement == null) {
+        readElement = typeReference.getMethod(propertyName.name);
+        if (readElement != null && !_isAccessible(readElement)) {
+          readElement = null;
+        }
+      }
+
+      if (readElement != null) {
+        readElement = _resolver.toLegacyElement(readElement);
+        if (_checkForStaticAccessToInstanceMember(propertyName, readElement)) {
+          readElementRecovery = readElement;
+          readElement = null;
+        }
+      } else {
+        var code = typeReference is EnumElement
+            ? CompileTimeErrorCode.UNDEFINED_ENUM_CONSTANT
+            : CompileTimeErrorCode.UNDEFINED_GETTER;
+        errorReporter.reportErrorForNode(
+          code,
+          propertyName,
+          [propertyName.name, typeReference.name],
+        );
+      }
+    }
+
+    ExecutableElement? writeElement;
+    ExecutableElement? writeElementRecovery;
+    if (hasWrite) {
+      writeElement = typeReference.getSetter(propertyName.name);
+      if (writeElement != null) {
+        writeElement = _resolver.toLegacyElement(writeElement);
+        if (!_isAccessible(writeElement)) {
+          errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.PRIVATE_SETTER,
+            propertyName,
+            [propertyName.name],
+          );
+        }
+        if (_checkForStaticAccessToInstanceMember(propertyName, writeElement)) {
+          writeElementRecovery = writeElement;
+          writeElement = null;
+        }
+      } else {
+        // Recovery, try to use getter.
+        writeElementRecovery = typeReference.getGetter(propertyName.name);
+        AssignmentVerifier(_definingLibrary, errorReporter).verify(
+          node: propertyName,
+          requested: null,
+          recovery: writeElementRecovery,
+          receiverType: typeReference.thisType,
+        );
+      }
+    }
+
+    return PropertyElementResolverResult(
+      readElementRequested: readElement,
+      readElementRecovery: readElementRecovery,
+      writeElementRequested: writeElement,
+      writeElementRecovery: writeElementRecovery,
+    );
+  }
+
   PropertyElementResolverResult _resolveTargetPrefixElement({
     required PrefixElement target,
     required SimpleIdentifier identifier,
@@ -755,7 +755,7 @@
       if (hasRead) {
         var name = Name(_definingLibrary.source.uri, propertyName.name);
         readElement = _resolver.inheritance
-            .getMember2(targetType.element, name, forSuper: true);
+            .getMember2(targetType.element2, name, forSuper: true);
 
         if (readElement != null) {
           readElement = _resolver.toLegacyElement(readElement);
@@ -765,7 +765,7 @@
           // But we would like to give the user at least some resolution.
           // So, we retry simply looking for an inherited member.
           readElement =
-              _resolver.inheritance.getInherited2(targetType.element, name);
+              _resolver.inheritance.getInherited2(targetType.element2, name);
           if (readElement != null) {
             errorReporter.reportErrorForNode(
               CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 787cbfe..2d6fa61 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1348,8 +1348,8 @@
 
     DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
-      ClassElement element = type.element;
-      if (element.isEnum || element.isMixin && asClass) {
+      final element = type.element2;
+      if (element is EnumElement || element is MixinElement && asClass) {
         _errorReporter.reportErrorForNode(errorCode, namedType);
         return;
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
index 6e9f0cc..b88be0e 100644
--- a/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/type_property_resolver.dart
@@ -236,7 +236,7 @@
     _needsGetterError = _getterRequested == null;
 
     if (_getterRequested == null && recoverWithStatic) {
-      var classElement = type.element as AbstractClassElementImpl;
+      var classElement = type.element2 as AbstractClassElementImpl;
       _getterRecovery ??=
           classElement.lookupStaticGetter(_name, _definingLibrary) ??
               classElement.lookupStaticMethod(_name, _definingLibrary);
@@ -249,7 +249,7 @@
     _needsSetterError = _setterRequested == null;
 
     if (_setterRequested == null && recoverWithStatic) {
-      var classElement = type.element as AbstractClassElementImpl;
+      var classElement = type.element2 as AbstractClassElementImpl;
       _setterRecovery ??=
           classElement.lookupStaticSetter(_name, _definingLibrary);
       _needsSetterError = _setterRecovery == null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
index ad94d27..31b7308 100644
--- a/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/typed_literal_resolver.dart
@@ -691,10 +691,12 @@
     if (literalType.isDynamic) {
       // The literal is ambiguous, and further analysis won't resolve the
       // ambiguity.  Leave it as neither a set nor a map.
-    } else if (literalType.element == _typeProvider.mapElement) {
+    } else if (literalType is InterfaceType &&
+        literalType.element2 == _typeProvider.mapElement) {
       node.becomeMap();
     } else {
-      assert(literalType.element == _typeProvider.setElement);
+      assert(literalType is InterfaceType &&
+          literalType.element2 == _typeProvider.setElement);
       node.becomeSet();
     }
     if (_strictInference &&
diff --git a/pkg/analyzer/lib/src/dart/resolver/variance.dart b/pkg/analyzer/lib/src/dart/resolver/variance.dart
index b248774..cba05a8 100644
--- a/pkg/analyzer/lib/src/dart/resolver/variance.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/variance.dart
@@ -36,7 +36,7 @@
       var result = unrelated;
       for (int i = 0; i < type.typeArguments.length; ++i) {
         var argument = type.typeArguments[i];
-        var parameter = type.element.typeParameters[i];
+        var parameter = type.element2.typeParameters[i];
 
         // TODO (kallentu) : Clean up TypeParameterElementImpl casting once
         // variance is added to the interface.
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 8b3e2ad..3d82b84 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -739,7 +739,7 @@
       var type = node.typeOrThrow;
       // Only report non-aliased, non-user-defined `Null?` and `dynamic?`. Do
       // not report synthetic `dynamic` in place of an unresolved type.
-      if ((type.element == _nullType.element ||
+      if ((type is InterfaceType && type.element2 == _nullType.element2 ||
               (type.isDynamic && name == 'dynamic')) &&
           type.alias == null) {
         _errorReporter.reportErrorForToken(
@@ -990,7 +990,7 @@
   void _checkForImmutable(NamedCompilationUnitMember node) {
     /// Return `true` if the given class [element] is annotated with the
     /// `@immutable` annotation.
-    bool isImmutable(ClassElement element) {
+    bool isImmutable(InterfaceElement element) {
       for (ElementAnnotation annotation in element.metadata) {
         if (annotation.isImmutable) {
           return true;
@@ -1002,29 +1002,29 @@
     /// Return `true` if the given class [element] or any superclass of it is
     /// annotated with the `@immutable` annotation.
     bool isOrInheritsImmutable(
-        ClassElement element, HashSet<ClassElement> visited) {
+        InterfaceElement element, Set<InterfaceElement> visited) {
       if (visited.add(element)) {
         if (isImmutable(element)) {
           return true;
         }
         for (InterfaceType interface in element.mixins) {
-          if (isOrInheritsImmutable(interface.element, visited)) {
+          if (isOrInheritsImmutable(interface.element2, visited)) {
             return true;
           }
         }
         for (InterfaceType mixin in element.interfaces) {
-          if (isOrInheritsImmutable(mixin.element, visited)) {
+          if (isOrInheritsImmutable(mixin.element2, visited)) {
             return true;
           }
         }
         if (element.supertype != null) {
-          return isOrInheritsImmutable(element.supertype!.element, visited);
+          return isOrInheritsImmutable(element.supertype!.element2, visited);
         }
       }
       return false;
     }
 
-    Iterable<String> nonFinalInstanceFields(ClassElement element) {
+    Iterable<String> nonFinalInstanceFields(InterfaceElement element) {
       return element.fields
           .where((FieldElement field) =>
               !field.isSynthetic && !field.isFinal && !field.isStatic)
@@ -1032,16 +1032,16 @@
     }
 
     Iterable<String> definedOrInheritedNonFinalInstanceFields(
-        ClassElement element, HashSet<ClassElement> visited) {
+        InterfaceElement element, Set<InterfaceElement> visited) {
       Iterable<String> nonFinalFields = [];
       if (visited.add(element)) {
         nonFinalFields = nonFinalInstanceFields(element);
         nonFinalFields = nonFinalFields.followedBy(element.mixins.expand(
-            (InterfaceType mixin) => nonFinalInstanceFields(mixin.element)));
+            (InterfaceType mixin) => nonFinalInstanceFields(mixin.element2)));
         if (element.supertype != null) {
           nonFinalFields = nonFinalFields.followedBy(
               definedOrInheritedNonFinalInstanceFields(
-                  element.supertype!.element, visited));
+                  element.supertype!.element2, visited));
         }
       }
       return nonFinalFields;
@@ -1172,7 +1172,7 @@
     // TODO(srawlins): Perhaps replace this with a getter on Element, like
     // `Element.hasOrInheritsSealed`?
     for (InterfaceType supertype in element.allSupertypes) {
-      ClassElement superclass = supertype.element;
+      final superclass = supertype.element2;
       if (superclass.hasSealed) {
         if (!currentPackageContains(superclass)) {
           if (element.superclassConstraints.contains(supertype)) {
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index 82b95dd..9a3e4c1 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -149,7 +149,7 @@
 
     var superMembers = <_SuperMember>[];
     for (var interface in interfaces) {
-      var superMember = _correspondingMember(interface.element, _thisMember);
+      var superMember = _correspondingMember(interface.element2, _thisMember);
       if (superMember != null) {
         superMembers.add(
           _SuperMember(interface, superMember),
@@ -218,7 +218,7 @@
   /// Return a member from [classElement] that corresponds to the [proto],
   /// or `null` if no such member exist.
   static ExecutableElement? _correspondingMember(
-    ClassElement classElement,
+    InterfaceElement classElement,
     ExecutableElement proto,
   ) {
     if (proto is MethodElement) {
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index a3aed31..00252ab 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -178,7 +178,7 @@
     } else if (node is MethodInvocation &&
         displayName == FunctionElement.CALL_METHOD_NAME) {
       var invokeType = node.staticInvokeType as InterfaceType;
-      var invokeClass = invokeType.element;
+      var invokeClass = invokeType.element2;
       displayName = "${invokeClass.name}.${element.displayName}";
     }
     var library = element is LibraryElement ? element : element.library;
diff --git a/pkg/analyzer/lib/src/error/error_handler_verifier.dart b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
index 0706474..5ba6a5c 100644
--- a/pkg/analyzer/lib/src/error/error_handler_verifier.dart
+++ b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
@@ -251,8 +251,8 @@
   /// Returns whether [element] represents the []
   bool _isDartCoreAsyncType(DartType type, String typeName) =>
       type is InterfaceType &&
-      type.element.name == typeName &&
-      type.element.library.isDartAsync;
+      type.element2.name == typeName &&
+      type.element2.library.isDartAsync;
 }
 
 /// Visits a function body, looking for return statements.
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 4e9bd87..5740b39 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -161,7 +161,7 @@
       return true;
     }
 
-    if (!classElement.isEnum &&
+    if (classElement is! EnumElement &&
         !classElement.isAbstract &&
         implementsDartCoreEnum) {
       reporter.reportErrorForToken(
@@ -214,7 +214,7 @@
           var fieldElement = field.declaredElement as FieldElement;
           _checkDeclaredMember(field.name2, libraryUri, fieldElement.getter);
           _checkDeclaredMember(field.name2, libraryUri, fieldElement.setter);
-          if (!member.isStatic && !classElement.isEnum) {
+          if (!member.isStatic && classElement is! EnumElement) {
             _checkIllegalEnumValuesDeclaration(field.name2);
           }
           if (!member.isStatic) {
@@ -232,7 +232,7 @@
         if (!(member.isStatic || member.isAbstract || member.isSetter)) {
           _checkIllegalConcreteEnumMemberDeclaration(member.name2);
         }
-        if (!member.isStatic && !classElement.isEnum) {
+        if (!member.isStatic && classElement is! EnumElement) {
           _checkIllegalEnumValuesDeclaration(member.name2);
         }
       }
@@ -263,7 +263,7 @@
             continue;
           }
           // We already reported ILLEGAL_ENUM_VALUES_INHERITANCE.
-          if (classElement.isEnum &&
+          if (classElement is EnumElement &&
               const {'values', 'values='}.contains(name.name)) {
             continue;
           }
@@ -375,7 +375,7 @@
   /// corresponding instance members in each of [directSuperInterfaces].
   void _checkDeclaredMembers(AstNode node, InterfaceType type,
       {required int mixinIndex}) {
-    var libraryUri = type.element.library.source.uri;
+    var libraryUri = type.element2.library.source.uri;
     for (var method in type.methods) {
       _checkDeclaredMember(node, libraryUri, method, mixinIndex: mixinIndex);
     }
@@ -402,11 +402,12 @@
       return false;
     }
 
-    var interfaceElement = type.element;
+    var interfaceElement = type.element2;
 
-    if (interfaceElement.isDartCoreEnum &&
+    if (interfaceElement is ClassElement &&
+        interfaceElement.isDartCoreEnum &&
         library.featureSet.isEnabled(Feature.enhanced_enums)) {
-      if (classElement.isAbstract || classElement.isEnum) {
+      if (classElement.isAbstract || classElement is EnumElement) {
         return false;
       }
       reporter.reportErrorForNode(
@@ -465,7 +466,7 @@
         )) {
           hasError = true;
         }
-        if (classElement.isEnum && _checkEnumMixin(namedType)) {
+        if (classElement is EnumElement && _checkEnumMixin(namedType)) {
           hasError = true;
         }
       }
@@ -479,8 +480,8 @@
       return false;
     }
 
-    var interfaceElement = type.element;
-    if (interfaceElement.isEnum) {
+    var interfaceElement = type.element2;
+    if (interfaceElement is EnumElement) {
       return false;
     }
 
@@ -595,9 +596,9 @@
   /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_IMPLEMENTS],
   /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON],
   /// [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH].
-  bool _checkForRecursiveInterfaceInheritance(ClassElement element,
-      [List<ClassElement>? path]) {
-    path ??= <ClassElement>[];
+  bool _checkForRecursiveInterfaceInheritance(InterfaceElement element,
+      [List<InterfaceElement>? path]) {
+    path ??= <InterfaceElement>[];
 
     // Detect error condition.
     int size = path.length;
@@ -637,26 +638,30 @@
     path.add(element);
 
     // n-case
-    var supertype = element.supertype;
-    if (supertype != null &&
-        _checkForRecursiveInterfaceInheritance(supertype.element, path)) {
-      return true;
-    }
-
-    for (InterfaceType type in element.mixins) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+    if (element is ClassElement) {
+      var supertype = element.supertype;
+      if (supertype != null &&
+          _checkForRecursiveInterfaceInheritance(supertype.element2, path)) {
         return true;
       }
     }
 
-    for (InterfaceType type in element.superclassConstraints) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+    for (InterfaceType type in element.mixins) {
+      if (_checkForRecursiveInterfaceInheritance(type.element2, path)) {
         return true;
       }
     }
 
+    if (element is MixinElement) {
+      for (InterfaceType type in element.superclassConstraints) {
+        if (_checkForRecursiveInterfaceInheritance(type.element2, path)) {
+          return true;
+        }
+      }
+    }
+
     for (InterfaceType type in element.interfaces) {
-      if (_checkForRecursiveInterfaceInheritance(type.element, path)) {
+      if (_checkForRecursiveInterfaceInheritance(type.element2, path)) {
         return true;
       }
     }
@@ -681,7 +686,7 @@
     // We ignore mixins because they don't inherit and members.
     // But to support `super.foo()` invocations we put members from superclass
     // constraints into the `superImplemented` bucket, the same we look below.
-    if (classElement.isMixin) {
+    if (classElement is MixinElement) {
       return;
     }
 
@@ -743,19 +748,23 @@
 
   /// Return the error code that should be used when the given class [element]
   /// references itself directly.
-  ErrorCode _getRecursiveErrorCode(ClassElement element) {
-    if (element.supertype?.element == classElement) {
-      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS;
+  ErrorCode _getRecursiveErrorCode(InterfaceElement element) {
+    if (element is ClassElement) {
+      if (element.supertype?.element2 == classElement) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_EXTENDS;
+      }
     }
 
-    for (InterfaceType type in element.superclassConstraints) {
-      if (type.element == classElement) {
-        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON;
+    if (element is MixinElement) {
+      for (InterfaceType type in element.superclassConstraints) {
+        if (type.element2 == classElement) {
+          return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_ON;
+        }
       }
     }
 
     for (InterfaceType type in element.mixins) {
-      if (type.element == classElement) {
+      if (type.element2 == classElement) {
         return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_WITH;
       }
     }
@@ -772,7 +781,7 @@
         ClassMember member, String memberName, String displayName) {
       if (memberName == name) {
         reporter.reportErrorForNode(
-          classElement.isEnum
+          classElement is EnumElement
               ? CompileTimeErrorCode.ENUM_WITH_ABSTRACT_MEMBER
               : CompileTimeErrorCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
           member,
diff --git a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
index a248430..7908d2d 100644
--- a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
+++ b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
@@ -72,16 +72,26 @@
     if (element.enclosingElement3 is! ClassElement) {
       return null;
     }
-    var classElement = element.enclosingElement3 as ClassElement;
+    var classElement = element.enclosingElement3 as InterfaceElement;
     String name = element.name;
 
     // Walk up the type hierarchy from [classElement], ignoring direct
     // interfaces.
-    Queue<ClassElement?> superclasses =
-        Queue.of(classElement.mixins.map((i) => i.element))
-          ..addAll(classElement.superclassConstraints.map((i) => i.element))
-          ..add(classElement.supertype?.element);
-    var visitedClasses = <ClassElement>{};
+    final superclasses = Queue<InterfaceElement?>();
+
+    void addToQueue(InterfaceElement element) {
+      superclasses.addAll(element.mixins.map((i) => i.element2));
+      if (element is ClassElement) {
+        superclasses.add(element.supertype?.element2);
+      }
+      if (element is MixinElement) {
+        superclasses
+            .addAll(element.superclassConstraints.map((i) => i.element2));
+      }
+    }
+
+    final visitedClasses = <InterfaceElement>{};
+    addToQueue(classElement);
     while (superclasses.isNotEmpty) {
       var ancestor = superclasses.removeFirst();
       if (ancestor == null || !visitedClasses.add(ancestor)) {
@@ -99,10 +109,7 @@
         // documentation of [mustCallSuper].
         return member;
       }
-      superclasses
-        ..addAll(ancestor.mixins.map((i) => i.element))
-        ..addAll(ancestor.superclassConstraints.map((i) => i.element))
-        ..add(ancestor.supertype?.element);
+      addToQueue(ancestor);
     }
     return null;
   }
@@ -144,7 +151,7 @@
   bool isConcrete(String name) {
     var self = this;
     if (self == null) return false;
-    var element = self.element;
+    var element = self.element2;
     return element.lookUpConcreteMethod(name, element.library) != null;
   }
 }
diff --git a/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart b/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
index a0308f1..3336cd2 100644
--- a/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
+++ b/pkg/analyzer/lib/src/error/null_safe_api_verifier.dart
@@ -45,10 +45,11 @@
     if (!_typeSystem.isNonNullableByDefault) return;
 
     final targetType = node.realTarget?.staticType;
-    final targetClass = targetType?.element;
-    if (targetClass == null || targetType is! InterfaceType) return;
+    if (targetType is! InterfaceType) return;
 
-    if (targetClass.library?.isDartAsync == true &&
+    final targetClass = targetType.element2;
+
+    if (targetClass.library.isDartAsync == true &&
         targetClass.name == 'Completer' &&
         node.methodName.name == 'complete') {
       _checkTypes(node, 'Completer.complete', targetType.typeArguments.single,
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 1386d07..3d4b8bd 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -330,8 +330,8 @@
       typeParameters = alias.element.typeParameters;
       typeArguments = alias.typeArguments;
     } else if (type is InterfaceType) {
-      elementName = type.element.name;
-      typeParameters = type.element.typeParameters;
+      elementName = type.element2.name;
+      typeParameters = type.element2.typeParameters;
       typeArguments = type.typeArguments;
     } else {
       return;
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 22e7a62..3cbfd39 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -262,9 +262,7 @@
         if (isIdentifierRead) {
           usedElements.unresolvedReadMembers.add(node.name);
         }
-      } else if (enclosingElement is ClassElement &&
-          enclosingElement.isEnum &&
-          element.name == 'values') {
+      } else if (enclosingElement is EnumElement && element.name == 'values') {
         // If the 'values' static accessor of the enum is accessed, then all of
         // the enum values have been read.
         for (var field in enclosingElement.fields) {
@@ -600,12 +598,12 @@
     }
     var enclosingElement = element.enclosingElement3;
 
-    if (enclosingElement is ClassElement) {
-      if (enclosingElement.isEnum) {
-        if (element is ConstructorElement && element.isGenerative) {
-          return false;
-        }
+    if (enclosingElement is EnumElement) {
+      if (element is ConstructorElement && element.isGenerative) {
+        return false;
       }
+    }
+    if (enclosingElement is ClassElement) {
       if (enclosingElement.isPrivate) {
         if (element.isStatic || element is ConstructorElement) {
           return false;
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 5710ff2..9a32845 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -829,8 +829,14 @@
       );
     } else {
       // TODO(danrubel): Skip the block rather than parsing it.
-      push(ast.emptyFunctionBody(
-          SyntheticToken(TokenType.SEMICOLON, leftBracket.charOffset)));
+      push(
+        EmptyFunctionBodyImpl(
+          semicolon: SyntheticToken(
+            TokenType.SEMICOLON,
+            leftBracket.charOffset,
+          ),
+        ),
+      );
     }
   }
 
@@ -871,7 +877,9 @@
     } else if (bodyObject is _RedirectingFactoryBody) {
       separator = bodyObject.equalToken;
       redirectedConstructor = bodyObject.constructorName;
-      body = ast.emptyFunctionBody(endToken);
+      body = EmptyFunctionBodyImpl(
+        semicolon: endToken,
+      );
     } else {
       internalProblem(
           templateInternalProblemUnhandled.withArguments(
@@ -952,7 +960,9 @@
     } else if (bodyObject is _RedirectingFactoryBody) {
       separator = bodyObject.equalToken;
       redirectedConstructor = bodyObject.constructorName;
-      body = ast.emptyFunctionBody(endToken);
+      body = EmptyFunctionBodyImpl(
+        semicolon: endToken,
+      );
     } else {
       internalProblem(
           templateInternalProblemUnhandled.withArguments(
@@ -1103,7 +1113,9 @@
     if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
-      body = ast.emptyFunctionBody(endToken);
+      body = EmptyFunctionBodyImpl(
+        semicolon: endToken,
+      );
     } else {
       internalProblem(
           templateInternalProblemUnhandled.withArguments(
@@ -1298,16 +1310,19 @@
     assert(optional(';', semicolon));
     debugEvent("DoWhileStatement");
 
-    var condition = pop() as ParenthesizedExpression;
-    var body = pop() as Statement;
-    push(ast.doStatement(
-        doKeyword,
-        body,
-        whileKeyword,
-        condition.leftParenthesis,
-        condition.expression,
-        condition.rightParenthesis,
-        semicolon));
+    var condition = pop() as ParenthesizedExpressionImpl;
+    var body = pop() as StatementImpl;
+    push(
+      DoStatementImpl(
+        doKeyword: doKeyword,
+        body: body,
+        whileKeyword: whileKeyword,
+        leftParenthesis: condition.leftParenthesis,
+        condition: condition.expression,
+        rightParenthesis: condition.rightParenthesis,
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -1428,7 +1443,9 @@
     if (bodyObject is FunctionBodyImpl) {
       body = bodyObject;
     } else if (bodyObject is _RedirectingFactoryBody) {
-      body = ast.emptyFunctionBody(endToken);
+      body = EmptyFunctionBodyImpl(
+        semicolon: endToken,
+      );
     } else {
       // Unhandled situation which should never happen.
       // Since this event handler is just a recovery attempt,
@@ -3095,7 +3112,11 @@
     debugEvent("DottedName");
 
     var components = popTypedList2<SimpleIdentifier>(count);
-    push(ast.dottedName(components));
+    push(
+      DottedNameImpl(
+        components: components,
+      ),
+    );
   }
 
   @override
@@ -3111,7 +3132,11 @@
     // TODO(scheglov) Change the parser to not produce these modifiers.
     pop(); // star
     pop(); // async
-    push(ast.emptyFunctionBody(semicolon));
+    push(
+      EmptyFunctionBodyImpl(
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -3119,7 +3144,11 @@
     assert(optional(';', semicolon));
     debugEvent("EmptyStatement");
 
-    push(ast.emptyStatement(semicolon));
+    push(
+      EmptyStatementImpl(
+        semicolon: semicolon,
+      ),
+    );
   }
 
   @override
@@ -3266,11 +3295,11 @@
     assert(optionalOrNull(';', semicolon));
     debugEvent("ExpressionFunctionBody");
 
-    var expression = pop() as Expression;
+    var expression = pop() as ExpressionImpl;
     var star = pop() as Token?;
     var asyncKeyword = pop() as Token?;
     if (parseFunctionBodies) {
-      push(ast.expressionFunctionBody2(
+      push(ExpressionFunctionBodyImpl(
         keyword: asyncKeyword,
         star: star,
         functionDefinition: arrowToken,
@@ -3278,7 +3307,11 @@
         semicolon: semicolon,
       ));
     } else {
-      push(ast.emptyFunctionBody(semicolon!));
+      push(
+        EmptyFunctionBodyImpl(
+          semicolon: semicolon!,
+        ),
+      );
     }
   }
 
@@ -3672,7 +3705,12 @@
     assert(token.type == TokenType.DOUBLE);
     debugEvent("LiteralDouble");
 
-    push(ast.doubleLiteral(token, double.parse(token.lexeme)));
+    push(
+      DoubleLiteralImpl(
+        literal: token,
+        value: double.parse(token.lexeme),
+      ),
+    );
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 751f6ca..70bb590 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -485,7 +485,7 @@
   /// Checks whether the given [expression] is a reference to a class. If it is
   /// then the element representing the class is returned, otherwise `null` is
   /// returned.
-  static ClassElement? getTypeReference(Expression expression) {
+  static InterfaceElement? getTypeReference(Expression expression) {
     if (expression is Identifier) {
       var element = expression.staticElement;
       if (element is ClassElement) {
@@ -493,7 +493,7 @@
       } else if (element is TypeAliasElement) {
         var aliasedType = element.aliasedType;
         if (aliasedType is InterfaceType) {
-          return aliasedType.element;
+          return aliasedType.element2;
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index e3f078a..d774a53 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -237,7 +237,7 @@
         type is InterfaceType &&
         type.nullabilitySuffix != NullabilitySuffix.question) {
       return type.lookUpMethod2(
-          FunctionElement.CALL_METHOD_NAME, type.element.library);
+          FunctionElement.CALL_METHOD_NAME, type.element2.library);
     } else {
       return null;
     }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 8703396..8a7106b5 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -283,7 +283,7 @@
   /// The language team is thinking about adding abstract fields, or external
   /// fields. But for now we will ignore such fields in `Struct` subtypes.
   bool get _isEnclosingClassFfiStruct {
-    var superClass = _enclosingClass?.supertype?.element;
+    var superClass = _enclosingClass?.supertype?.element2;
     return superClass != null &&
         superClass.library.name == 'dart.ffi' &&
         superClass.name == 'Struct';
@@ -292,7 +292,7 @@
   /// The language team is thinking about adding abstract fields, or external
   /// fields. But for now we will ignore such fields in `Struct` subtypes.
   bool get _isEnclosingClassFfiUnion {
-    var superClass = _enclosingClass?.supertype?.element;
+    var superClass = _enclosingClass?.supertype?.element2;
     return superClass != null &&
         superClass.library.name == 'dart.ffi' &&
         superClass.name == 'Union';
@@ -1460,12 +1460,12 @@
             mixinName, CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS)) {
           problemReported = true;
         } else {
-          ClassElement mixinElement = mixinType.element;
+          final mixinElement = mixinType.element2;
           if (_checkForExtendsOrImplementsDeferredClass(
               mixinName, CompileTimeErrorCode.MIXIN_DEFERRED_CLASS)) {
             problemReported = true;
           }
-          if (mixinElement.isMixin) {
+          if (mixinElement is MixinElement) {
             if (_checkForMixinSuperclassConstraints(
                 mixinNameIndex, mixinName)) {
               problemReported = true;
@@ -1504,7 +1504,7 @@
       // REDIRECT_TO_MISSING_CONSTRUCTOR case
       NamedType constructorNamedType = redirectedConstructor.type;
       DartType redirectedType = constructorNamedType.typeOrThrow;
-      if (redirectedType.element != null && !redirectedType.isDynamic) {
+      if (redirectedType is! DynamicType) {
         // Prepare the constructor name
         String constructorStrName = constructorNamedType.name.name;
         if (redirectedConstructor.name != null) {
@@ -1854,7 +1854,7 @@
       String name = typeParameter.name;
       // name is same as the name of the enclosing class
       if (enclosingClass.name == name) {
-        var code = enclosingClass.isMixin
+        var code = enclosingClass is MixinElement
             ? CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MIXIN
             : CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS;
         errorReporter.reportErrorForElement(code, typeParameter, [name]);
@@ -1864,7 +1864,7 @@
           enclosingClass.getMethod(name) != null ||
           enclosingClass.getGetter(name) != null ||
           enclosingClass.getSetter(name) != null) {
-        var code = enclosingClass.isMixin
+        var code = enclosingClass is MixinElement
             ? CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_MIXIN
             : CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER_CLASS;
         errorReporter.reportErrorForElement(code, typeParameter, [name]);
@@ -1999,7 +1999,7 @@
         );
         redirectingInitializerCount++;
       } else if (initializer is SuperConstructorInvocation) {
-        if (enclosingClass.isEnum) {
+        if (enclosingClass is EnumElement) {
           errorReporter.reportErrorForToken(
             CompileTimeErrorCode.SUPER_IN_ENUM_CONSTRUCTOR,
             initializer.superKeyword,
@@ -2018,7 +2018,7 @@
     if (redirectingInitializerCount > 0) {
       for (ConstructorInitializer initializer in declaration.initializers) {
         if (initializer is SuperConstructorInvocation) {
-          if (!enclosingClass.isEnum) {
+          if (enclosingClass is! EnumElement) {
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
                 initializer);
@@ -2036,11 +2036,11 @@
         }
       }
     }
-    if (!enclosingClass.isEnum &&
+    if (enclosingClass is! EnumElement &&
         redirectingInitializerCount == 0 &&
         superInitializerCount == 1 &&
         superInitializer != declaration.initializers.last) {
-      var superNamedType = enclosingClass.supertype!.element.displayName;
+      var superNamedType = enclosingClass.supertype!.element2.displayName;
       var constructorStrName = superNamedType;
       var constructorName = superInitializer.constructorName;
       if (constructorName != null) {
@@ -2077,7 +2077,7 @@
     // check for mixins
     var instanceFields = <FieldElement>[];
     for (var mixin in enclosingClass.mixins) {
-      instanceFields.addAll(mixin.element.fields.where((field) {
+      instanceFields.addAll(mixin.element2.fields.where((field) {
         if (field.isStatic) {
           return false;
         }
@@ -2113,7 +2113,7 @@
     }
 
     // Enum(s) always call a const super-constructor.
-    if (enclosingClass.isEnum) {
+    if (enclosingClass is EnumElement) {
       return false;
     }
 
@@ -2139,7 +2139,7 @@
     if (supertype.isDartCoreObject) {
       return false;
     }
-    var unnamedConstructor = supertype.element.unnamedConstructor;
+    var unnamedConstructor = supertype.element2.unnamedConstructor;
     if (unnamedConstructor == null || unnamedConstructor.isConst) {
       return false;
     }
@@ -2208,7 +2208,10 @@
       InstanceCreationExpression expression,
       NamedType namedType,
       InterfaceType type) {
-    if (type.element.isAbstract && !type.element.isMixin) {
+    final element = type.element2;
+    if (element is! MixinElement &&
+        element is ClassElement &&
+        element.isAbstract) {
       var element = expression.constructorName.staticElement;
       if (element != null && !element.isFactory) {
         bool isImplicit =
@@ -2227,7 +2230,7 @@
   /// Verify that the given [expression] is not a mixin instantiation.
   void _checkForConstOrNewWithMixin(InstanceCreationExpression expression,
       NamedType namedType, InterfaceType type) {
-    if (type.element.isMixin) {
+    if (type.element2 is MixinElement) {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MIXIN_INSTANTIATE, namedType);
     }
@@ -2273,8 +2276,7 @@
     }
     DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
-      ClassElement element = type.element;
-      if (element.isEnum) {
+      if (type.element2 is EnumElement) {
         // We have already reported the error.
         return;
       }
@@ -2633,7 +2635,7 @@
     }
     var type = namedType.type;
     return type is InterfaceType &&
-        _typeProvider.isNonSubtypableClass(type.element);
+        _typeProvider.isNonSubtypableClass(type.element2);
   }
 
   void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
@@ -2921,8 +2923,8 @@
   /// the [name] is reference to an instance member.
   ///
   /// See [CompileTimeErrorCode.INSTANCE_ACCESS_TO_STATIC_MEMBER].
-  void _checkForInstanceAccessToStaticMember(
-      ClassElement? typeReference, Expression? target, SimpleIdentifier name) {
+  void _checkForInstanceAccessToStaticMember(InterfaceElement? typeReference,
+      Expression? target, SimpleIdentifier name) {
     if (_isInComment) {
       // OK, in comment
       return;
@@ -3301,8 +3303,8 @@
 
     var hasCaseNull = false;
     if (expressionType is InterfaceType) {
-      var enumElement = expressionType.element;
-      if (enumElement.isEnum) {
+      var enumElement = expressionType.element2;
+      if (enumElement is EnumElement) {
         var constantNames = enumElement.fields
             .where((field) => field.isEnumConstant)
             .map((field) => field.name)
@@ -3354,7 +3356,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR].
   bool _checkForMixinClassDeclaresConstructor(
-      NamedType mixinName, ClassElement mixinElement) {
+      NamedType mixinName, InterfaceElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
       if (!constructor.isSynthetic && !constructor.isFactory) {
         errorReporter.reportErrorForNode(
@@ -3374,8 +3376,11 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
   bool _checkForMixinInheritsNotFromObject(
-      NamedType mixinName, ClassElement mixinElement) {
-    if (mixinElement.isEnum) {
+      NamedType mixinName, InterfaceElement mixinElement) {
+    if (mixinElement is EnumElement) {
+      return false;
+    }
+    if (mixinElement is! ClassElement) {
       return false;
     }
 
@@ -3437,7 +3442,7 @@
   /// [mixinIndex] in the list of mixins of [_enclosingClass] has concrete
   /// implementations of all the super-invoked members of the [mixinElement].
   bool _checkForMixinSuperInvokedMembers(int mixinIndex, NamedType mixinName,
-      ClassElement mixinElement, InterfaceType mixinType) {
+      InterfaceElement mixinElement, InterfaceType mixinType) {
     var mixinElementImpl = mixinElement as ClassElementImpl;
     if (mixinElementImpl.superInvokedNames.isEmpty) {
       return false;
@@ -3517,7 +3522,7 @@
         }
         names[name] = namedType.name.name;
         var inheritedMember = _inheritanceManager.getMember2(
-          declaredSupertype.element,
+          declaredSupertype.element2,
           Name(library.source.uri, name),
           concrete: true,
         );
@@ -3541,7 +3546,7 @@
     for (NamedType mixinType in withClause.mixinTypes) {
       DartType type = mixinType.typeOrThrow;
       if (type is InterfaceType) {
-        LibraryElement library = type.element.library;
+        LibraryElement library = type.element2.library;
         if (library != _currentLibrary) {
           for (PropertyAccessorElement accessor in type.accessors) {
             if (accessor.isStatic) {
@@ -3592,8 +3597,8 @@
     }
     DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
-      ClassElement element = type.element;
-      if (element.isEnum || element.isMixin) {
+      final element = type.element2;
+      if (element is EnumElement || element is MixinElement) {
         // We have already reported the error.
         return;
       }
@@ -3632,7 +3637,7 @@
     if (superType == null) {
       return;
     }
-    ClassElement superElement = superType.element;
+    final superElement = superType.element2;
     // try to find default generative super constructor
     var superUnnamedConstructor = superElement.unnamedConstructor;
     superUnnamedConstructor = superUnnamedConstructor != null
@@ -3654,7 +3659,7 @@
       }
     }
 
-    if (!_typeProvider.isNonSubtypableClass(superType.element)) {
+    if (!_typeProvider.isNonSubtypableClass(superType.element2)) {
       // Don't report this diagnostic for non-subtypable classes because the
       // real problem was already reported.
       errorReporter.reportErrorForToken(
@@ -3675,7 +3680,7 @@
       // subclass has only factory constructors.
       return false;
     }
-    ClassElement superElement = superType.element;
+    final superElement = superType.element2;
     if (superElement.constructors.isEmpty) {
       // Exclude empty constructor set, which indicates other errors occurred.
       return false;
@@ -3694,7 +3699,7 @@
   }
 
   void _checkForNonConstGenerativeEnumConstructor(ConstructorDeclaration node) {
-    if (_enclosingClass?.isEnum == true &&
+    if (_enclosingClass is EnumElement &&
         node.constKeyword == null &&
         node.factoryKeyword == null) {
       errorReporter.reportErrorForName(
@@ -3741,7 +3746,7 @@
     if (variableList.isFinal) return;
 
     var enclosingClass = _enclosingClass;
-    if (enclosingClass == null || !enclosingClass.isEnum) {
+    if (enclosingClass == null || enclosingClass is! EnumElement) {
       return;
     }
 
@@ -4120,11 +4125,11 @@
       if (!detectedRepeatOnIndex[i]) {
         var type = namedTypes[i].type;
         if (type is InterfaceType) {
-          var element = type.element;
+          var element = type.element2;
           for (int j = i + 1; j < count; j++) {
             var otherNode = namedTypes[j];
             var otherType = otherNode.type;
-            if (otherType is InterfaceType && otherType.element == element) {
+            if (otherType is InterfaceType && otherType.element2 == element) {
               detectedRepeatOnIndex[j] = true;
               errorReporter
                   .reportErrorForNode(errorCode, otherNode, [element.name]);
@@ -4205,7 +4210,7 @@
   ///
   /// See [CompileTimeErrorCode.STATIC_ACCESS_TO_INSTANCE_MEMBER].
   void _checkForStaticAccessToInstanceMember(
-      ClassElement? typeReference, SimpleIdentifier name) {
+      InterfaceElement? typeReference, SimpleIdentifier name) {
     // OK, in comment
     if (_isInComment) {
       return;
@@ -4400,7 +4405,7 @@
     if (superType == null) {
       return;
     }
-    ClassElement superElement = superType.element;
+    final superElement = superType.element2;
 
     if (superElement.constructors
         .every((constructor) => constructor.isFactory)) {
@@ -4925,14 +4930,14 @@
       return;
     }
 
-    var superElement = _enclosingClass!.supertype?.element;
+    var superElement = _enclosingClass!.supertype?.element2;
     if (superElement == null) {
       return;
     }
 
     for (var interfaceNode in implementsClause.interfaces) {
       var type = interfaceNode.type;
-      if (type is InterfaceType && type.element == superElement) {
+      if (type is InterfaceType && type.element2 == superElement) {
         errorReporter.reportErrorForNode(
           CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
           interfaceNode,
@@ -4972,14 +4977,14 @@
       return;
     }
 
-    var superElement = _enclosingClass!.supertype?.element;
+    var superElement = _enclosingClass!.supertype?.element2;
     if (superElement == null) {
       return;
     }
 
     for (var mixinNode in withClause.mixinTypes) {
       var type = mixinNode.type;
-      if (type is InterfaceType && type.element == superElement) {
+      if (type is InterfaceType && type.element2 == superElement) {
         errorReporter.reportErrorForNode(
           CompileTimeErrorCode.MIXINS_SUPER_CLASS,
           mixinNode,
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 8750f1f..f436d60 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -156,7 +156,7 @@
       if (implementsClause != null) {
         final compoundType = node.declaredElement!.thisType;
         final structType = compoundType.superclass!;
-        final ffiLibrary = structType.element.library;
+        final ffiLibrary = structType.element2.library;
         final finalizableElement = ffiLibrary.getType(_finalizableClassName)!;
         final finalizableType = finalizableElement.thisType;
         if (typeSystem.isSubtypeOf(compoundType, finalizableType)) {
@@ -427,7 +427,12 @@
           'NativeFieldWrapperClass1') {
         return true;
       }
-      type = type.element.supertype;
+      final element = type.element2;
+      if (element is ClassElement) {
+        type = element.supertype;
+      } else {
+        break;
+      }
     }
     return false;
   }
@@ -538,7 +543,7 @@
       }
       if (nativeType.isCompoundSubtype) {
         if (!allowEmptyStruct) {
-          if (nativeType.element.isEmptyStruct) {
+          if (nativeType.element2.isEmptyStruct) {
             // TODO(dartbug.com/36780): This results in an error message not
             // mentioning empty structs at all.
             return false;
@@ -585,7 +590,7 @@
 
   _PrimitiveDartType _primitiveNativeType(DartType nativeType) {
     if (nativeType is InterfaceType) {
-      final element = nativeType.element;
+      final element = nativeType.element2;
       if (element.isFfiClass) {
         final String name = element.name;
         if (_primitiveIntegerNativeTypes.contains(name)) {
@@ -669,13 +674,16 @@
       if (argument is SetOrMapLiteral) {
         for (final element in argument.elements) {
           if (element is MapLiteralEntry) {
-            final name = element.value.staticType?.element?.name;
-            if (name != null &&
-                !_primitiveIntegerNativeTypesFixedSize.contains(name)) {
-              _errorReporter.reportErrorForNode(
+            final valueType = element.value.staticType;
+            if (valueType is InterfaceType) {
+              final name = valueType.element2.name;
+              if (!_primitiveIntegerNativeTypesFixedSize.contains(name)) {
+                _errorReporter.reportErrorForNode(
                   FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
                   element.value,
-                  [name]);
+                  [name],
+                );
+              }
             }
           }
         }
@@ -689,13 +697,16 @@
       return;
     }
     for (final nativeType in mappingValues.values) {
-      final nativeTypeName = nativeType?.type?.element?.name;
-      if (nativeTypeName != null &&
-          !_primitiveIntegerNativeTypesFixedSize.contains(nativeTypeName)) {
-        _errorReporter.reportErrorForNode(
+      final type = nativeType?.type;
+      if (type is InterfaceType) {
+        final nativeTypeName = type.element2.name;
+        if (!_primitiveIntegerNativeTypesFixedSize.contains(nativeTypeName)) {
+          _errorReporter.reportErrorForNode(
             FfiCode.ABI_SPECIFIC_INTEGER_MAPPING_UNSUPPORTED,
             arguments.first,
-            [nativeTypeName]);
+            [nativeTypeName],
+          );
+        }
       }
     }
   }
@@ -875,7 +886,7 @@
     final nativeReturnType = _primitiveNativeType(nativeType);
     if (nativeReturnType == _PrimitiveDartType.int ||
         (nativeType is InterfaceType &&
-            nativeType.superclass?.element.name ==
+            nativeType.superclass?.element2.name ==
                 _abiSpecificIntegerClassName)) {
       return dartType.isDartCoreInt;
     } else if (nativeReturnType == _PrimitiveDartType.double) {
@@ -1001,8 +1012,8 @@
         final arrayDimensions = declaredType.arrayDimensions;
         _validateSizeOfAnnotation(fieldType, annotations, arrayDimensions);
       } else if (declaredType.isCompoundSubtype) {
-        final clazz = (declaredType as InterfaceType).element;
-        if (clazz.isEmptyStruct) {
+        final clazz = (declaredType as InterfaceType).element2;
+        if (clazz is ClassElement && clazz.isEmptyStruct) {
           _errorReporter.reportErrorForNode(FfiCode.EMPTY_STRUCT, node, [
             clazz.name,
             clazz.supertype!.getDisplayString(withNullability: false)
@@ -1487,7 +1498,7 @@
   }
 }
 
-extension on ClassElement {
+extension on InterfaceElement {
   bool get isEmptyStruct {
     for (final field in fields) {
       final declaredType = field.type;
@@ -1522,17 +1533,17 @@
 extension on DartType? {
   bool get isAbiSpecificInteger {
     final self = this;
-    return self is InterfaceType && self.element.isAbiSpecificInteger;
+    return self is InterfaceType && self.element2.isAbiSpecificInteger;
   }
 
   bool get isStruct {
     final self = this;
-    return self is InterfaceType && self.element.isStruct;
+    return self is InterfaceType && self.element2.isStruct;
   }
 
   bool get isUnion {
     final self = this;
-    return self is InterfaceType && self.element.isUnion;
+    return self is InterfaceType && self.element2.isUnion;
   }
 }
 
@@ -1541,8 +1552,8 @@
     DartType iterator = this;
     int dimensions = 0;
     while (iterator is InterfaceType &&
-        iterator.element.name == FfiVerifier._arrayClassName &&
-        iterator.element.isFfiClass) {
+        iterator.element2.name == FfiVerifier._arrayClassName &&
+        iterator.element2.isFfiClass) {
       dimensions++;
       iterator = iterator.typeArguments.single;
     }
@@ -1552,7 +1563,7 @@
   bool get isAbiSpecificInteger {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       final name = element.name;
       return name == FfiVerifier._abiSpecificIntegerClassName &&
           element.isFfiClass;
@@ -1565,9 +1576,9 @@
   bool get isAbiSpecificIntegerSubtype {
     final self = this;
     if (self is InterfaceType) {
-      final superType = self.element.supertype;
+      final superType = self.element2.supertype;
       if (superType != null) {
-        final superClassElement = superType.element;
+        final superClassElement = superType.element2;
         return superClassElement.name ==
                 FfiVerifier._abiSpecificIntegerClassName &&
             superClassElement.isFfiClass;
@@ -1580,7 +1591,7 @@
   bool get isArray {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       return element.name == FfiVerifier._arrayClassName && element.isFfiClass;
     }
     return false;
@@ -1589,7 +1600,7 @@
   bool get isCompound {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       final name = element.name;
       return (name == FfiVerifier._structClassName ||
               name == FfiVerifier._unionClassName) &&
@@ -1602,7 +1613,7 @@
   bool get isCompoundSubtype {
     final self = this;
     if (self is InterfaceType) {
-      final superType = self.element.supertype;
+      final superType = self.element2.supertype;
       if (superType != null) {
         return superType.isCompound;
       }
@@ -1613,7 +1624,7 @@
   bool get isHandle {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       return element.name == 'Handle' && element.isFfiClass;
     }
     return false;
@@ -1623,7 +1634,7 @@
   bool get isNativeFunction {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       return element.name == 'NativeFunction' && element.isFfiClass;
     }
     return false;
@@ -1633,7 +1644,7 @@
   bool get isNativeType {
     final self = this;
     if (self is InterfaceType) {
-      final element = self.element;
+      final element = self.element2;
       return element.name == 'NativeType' && element.isFfiClass;
     }
     return false;
@@ -1643,9 +1654,9 @@
   bool get isOpaqueSubtype {
     final self = this;
     if (self is InterfaceType) {
-      final superType = self.element.supertype;
+      final superType = self.element2.supertype;
       if (superType != null) {
-        final superClassElement = superType.element;
+        final superClassElement = superType.element2;
         return superClassElement.name == FfiVerifier._opaqueClassName &&
             superClassElement.isFfiClass;
       }
@@ -1655,7 +1666,7 @@
 
   bool get isPointer {
     final self = this;
-    return self is InterfaceType && self.element.isPointer;
+    return self is InterfaceType && self.element2.isPointer;
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index f8c23a9..8d222fa 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -3814,7 +3814,7 @@
 
   factory _SwitchExhaustiveness(DartType expressionType) {
     if (expressionType is InterfaceType) {
-      var enum_ = expressionType.element;
+      var enum_ = expressionType.element2;
       if (enum_ is EnumElementImpl) {
         return _SwitchExhaustiveness._(
           enum_.constants.toSet(),
diff --git a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
index 0dae99f..e564a7a 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -45,28 +45,6 @@
         rightHandSide: rightHandSide as ExpressionImpl,
       );
 
-  static ExpressionFunctionBodyImpl asyncExpressionFunctionBody(
-          Expression expression) =>
-      astFactory.expressionFunctionBody2(
-        keyword:
-            TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
-        star: null,
-        functionDefinition: TokenFactory.tokenFromType(TokenType.FUNCTION),
-        expression: expression,
-        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-      );
-
-  static ExpressionFunctionBodyImpl asyncGeneratorExpressionFunctionBody(
-          Expression expression) =>
-      astFactory.expressionFunctionBody2(
-        keyword:
-            TokenFactory.tokenFromTypeAndString(TokenType.IDENTIFIER, "async"),
-        star: TokenFactory.tokenFromType(TokenType.STAR),
-        functionDefinition: TokenFactory.tokenFromType(TokenType.FUNCTION),
-        expression: expression,
-        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-      );
-
   static IndexExpressionImpl cascadedIndexExpression(Expression index) =>
       astFactory.indexExpressionForCascade2(
           period: TokenFactory.tokenFromType(TokenType.PERIOD_PERIOD),
@@ -224,7 +202,9 @@
             : TokenFactory.tokenFromType(TokenType.PERIOD),
         initializers: initializers,
         redirectedConstructor: null,
-        body: emptyFunctionBody(),
+        body: EmptyFunctionBodyImpl(
+          semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+        ),
       );
 
   static ConstructorDeclarationImpl constructorDeclaration2(
@@ -285,25 +265,6 @@
     return astFactory.documentationComment(tokens, references);
   }
 
-  static DoStatementImpl doStatement(Statement body, Expression condition) =>
-      astFactory.doStatement(
-          TokenFactory.tokenFromKeyword(Keyword.DO),
-          body,
-          TokenFactory.tokenFromKeyword(Keyword.WHILE),
-          TokenFactory.tokenFromType(TokenType.OPEN_PAREN),
-          condition,
-          TokenFactory.tokenFromType(TokenType.CLOSE_PAREN),
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
-
-  static DoubleLiteralImpl doubleLiteral(double value) => astFactory
-      .doubleLiteral(TokenFactory.tokenFromString(value.toString()), value);
-
-  static EmptyFunctionBodyImpl emptyFunctionBody() => astFactory
-      .emptyFunctionBody(TokenFactory.tokenFromType(TokenType.SEMICOLON));
-
-  static EmptyStatementImpl emptyStatement() => astFactory
-      .emptyStatement(TokenFactory.tokenFromType(TokenType.SEMICOLON));
-
   static ExportDirectiveImpl exportDirective(
           List<Annotation> metadata, String uri,
           [List<Combinator> combinators = const []]) =>
@@ -321,16 +282,6 @@
           [List<Combinator> combinators = const []]) =>
       exportDirective([], uri, combinators);
 
-  static ExpressionFunctionBodyImpl expressionFunctionBody(
-          Expression expression) =>
-      astFactory.expressionFunctionBody2(
-        keyword: null,
-        star: null,
-        functionDefinition: TokenFactory.tokenFromType(TokenType.FUNCTION),
-        expression: expression,
-        semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
-      );
-
   static ExpressionStatementImpl expressionStatement(Expression expression) =>
       astFactory.expressionStatement(
           expression, TokenFactory.tokenFromType(TokenType.SEMICOLON));
@@ -807,7 +758,9 @@
         name: name as SimpleIdentifierImpl,
         typeParameters: null,
         parameters: parameters as FormalParameterListImpl?,
-        body: emptyFunctionBody(),
+        body: EmptyFunctionBodyImpl(
+          semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON),
+        ),
       );
 
   static MethodDeclarationImpl methodDeclaration2(
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index c23c958..8298cb0 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:analyzer/src/summary2/ast_binary_flags.dart';
@@ -435,12 +434,17 @@
 
   DottedName _readDottedName() {
     var components = _readNodeList<SimpleIdentifier>();
-    return astFactory.dottedName(components);
+    return DottedNameImpl(
+      components: components,
+    );
   }
 
   DoubleLiteral _readDoubleLiteral() {
     var value = _reader.readDouble();
-    var node = AstTestFactory.doubleLiteral(value);
+    var node = DoubleLiteralImpl(
+      literal: StringToken(TokenType.STRING, '$value', -1),
+      value: value,
+    );
     _readExpressionResolution(node);
     return node;
   }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 70e39fc..09e4d9e 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -1691,35 +1691,35 @@
       var type = _readFunctionType();
       return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType) {
-      var element = readElement() as ClassElement;
+      var element = readElement() as InterfaceElement;
       var typeArguments = _readTypeList();
       var nullability = _readNullability();
       var type = InterfaceTypeImpl(
-        element: element,
+        element2: element,
         typeArguments: typeArguments,
         nullabilitySuffix: nullability,
       );
       return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_none) {
-      var element = readElement() as ClassElement;
+      var element = readElement() as InterfaceElement;
       var type = InterfaceTypeImpl(
-        element: element,
+        element2: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.none,
       );
       return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_question) {
-      var element = readElement() as ClassElement;
+      var element = readElement() as InterfaceElement;
       var type = InterfaceTypeImpl(
-        element: element,
+        element2: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.question,
       );
       return _readAliasElementArguments(type);
     } else if (tag == Tag.InterfaceType_noTypeArguments_star) {
-      var element = readElement() as ClassElement;
+      var element = readElement() as InterfaceElement;
       var type = InterfaceTypeImpl(
-        element: element,
+        element2: element,
         typeArguments: const <DartType>[],
         nullabilitySuffix: NullabilitySuffix.star,
       );
@@ -1815,7 +1815,7 @@
         );
       } else if (type is InterfaceType) {
         return InterfaceTypeImpl(
-          element: type.element,
+          element2: type.element2,
           typeArguments: type.typeArguments,
           nullabilitySuffix: type.nullabilitySuffix,
           alias: InstantiatedTypeAliasElementImpl(
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index b1a07e3..3f1a5da 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -658,11 +658,11 @@
           writeByte(Tag.InterfaceType_noTypeArguments_star);
         }
         // TODO(scheglov) Write raw
-        writeElement(type.element);
+        writeElement(type.element2);
       } else {
         writeByte(Tag.InterfaceType);
         // TODO(scheglov) Write raw
-        writeElement(type.element);
+        writeElement(type.element2);
         writeUInt30(typeArguments.length);
         for (var i = 0; i < typeArguments.length; ++i) {
           writeType(typeArguments[i]);
diff --git a/pkg/analyzer/lib/src/summary2/macro_application.dart b/pkg/analyzer/lib/src/summary2/macro_application.dart
index 40ca9ad..377dfb7 100644
--- a/pkg/analyzer/lib/src/summary2/macro_application.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_application.dart
@@ -305,7 +305,7 @@
         final variableType = variable.type;
         if (variable is ConstTopLevelVariableElementImpl &&
             variableType is InterfaceType) {
-          final macroClass = variableType.element;
+          final macroClass = variableType.element2;
           final initializer = variable.constantInitializer;
           if (macroClass is ClassElementImpl &&
               macroClass.isMacro &&
diff --git a/pkg/analyzer/lib/src/summary2/macro_declarations.dart b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
index 079a09a..5730261 100644
--- a/pkg/analyzer/lib/src/summary2/macro_declarations.dart
+++ b/pkg/analyzer/lib/src/summary2/macro_declarations.dart
@@ -98,7 +98,7 @@
       return macro.NamedTypeAnnotationImpl(
         id: macro.RemoteInstance.uniqueId,
         isNullable: type.nullabilitySuffix == NullabilitySuffix.question,
-        identifier: identifier(type.element),
+        identifier: identifier(type.element2),
         typeArguments: type.typeArguments.map(_dartType).toList(),
       );
     } else if (type is TypeParameterType) {
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index a5a5f13..de81111 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -179,7 +179,7 @@
       var superType = classElement.supertype;
       if (superType != null) {
         var index = classElement.constructors.indexOf(_constructor);
-        var superConstructors = superType.element.constructors
+        var superConstructors = superType.element2.constructors
             .where((element) => element.isAccessibleIn2(classElement.library))
             .toList();
         if (index < superConstructors.length) {
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 28bb1b2..5014c29 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -19,7 +19,7 @@
 
 /// Return `true` if [type] can be used as a class.
 bool _isInterfaceTypeClass(InterfaceType type) {
-  if (type.element.isMixin) {
+  if (type.element2 is MixinElement) {
     return false;
   }
   return _isInterfaceTypeInterface(type);
@@ -27,7 +27,7 @@
 
 /// Return `true` if [type] can be used as an interface or a mixin.
 bool _isInterfaceTypeInterface(InterfaceType type) {
-  if (type.element.isEnum) {
+  if (type.element2 is EnumElement) {
     return false;
   }
   if (type.isDartCoreFunction || type.isDartCoreNull) {
@@ -393,11 +393,11 @@
   }
 
   InterfaceType? _findInterfaceTypeForElement(
-    ClassElement element,
+    InterfaceElement element,
     List<InterfaceType> interfaceTypes,
   ) {
     for (var interfaceType in interfaceTypes) {
-      if (interfaceType.element == element) return interfaceType;
+      if (interfaceType.element2 == element) return interfaceType;
     }
     return null;
   }
@@ -409,7 +409,7 @@
     var result = <InterfaceType>[];
     for (var constraint in constraints) {
       var interfaceType = _findInterfaceTypeForElement(
-        constraint.element,
+        constraint.element2,
         interfaceTypes,
       );
 
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index df8f7f7..a5dd06b 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -579,8 +579,9 @@
         expectedElement = _typeProvider.streamElement;
       } else {
         // Future<T> -> FutureOr<T>
-        var typeArg = (type.element == _typeProvider.futureElement)
-            ? (type as InterfaceType).typeArguments[0]
+        var typeArg = (type is InterfaceType &&
+                type.element2 == _typeProvider.futureElement)
+            ? type.typeArguments[0]
             : _typeProvider.dynamicType;
         return _typeProvider.futureOrType(typeArg);
       }
@@ -608,7 +609,7 @@
     }
     if (type.isDynamic) {
       return type;
-    } else if (type is InterfaceType && type.element == expectedElement) {
+    } else if (type is InterfaceType && type.element2 == expectedElement) {
       return type.typeArguments[0];
     } else {
       // Malformed type - fallback on analyzer error.
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index ee331d8..e69f550 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -507,7 +507,7 @@
   /// interface [type].
   void _inferType(InterfaceType? type) {
     if (type != null) {
-      _inferClass(type.element);
+      _inferClass(type.element2);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 6638cab..942afd0 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -163,6 +163,14 @@
     return _node(search, (n) => n is DoubleLiteral);
   }
 
+  EmptyFunctionBody emptyFunctionBody(String search) {
+    return _node(search, (n) => n is EmptyFunctionBody);
+  }
+
+  EmptyStatement emptyStatement(String search) {
+    return _node(search, (n) => n is EmptyStatement);
+  }
+
   EnumConstantDeclaration enumConstantDeclaration(String search) {
     return _node(search, (n) => n is EnumConstantDeclaration);
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
index 20a95d0..0772dd1 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk_elements.dart
@@ -1052,11 +1052,11 @@
   }
 
   InterfaceType _interfaceType(
-    ClassElement element, {
+    InterfaceElement element, {
     List<DartType> typeArguments = const [],
   }) {
     return InterfaceTypeImpl(
-      element: element,
+      element2: element,
       typeArguments: typeArguments,
       nullabilitySuffix: NullabilitySuffix.none,
     );
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index b22e22d..64790b4 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -2,6 +2,7 @@
 // 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:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/utilities.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/token.dart';
@@ -9,6 +10,7 @@
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
@@ -17,6 +19,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../generated/parser_test_base.dart' show ParserTestCase;
+import '../../src/diagnostics/parser_diagnostics.dart';
 import '../../util/feature_sets.dart';
 
 main() {
@@ -155,80 +158,68 @@
 }
 
 @reflectiveTest
-class ConstructorDeclarationTest {
+class ConstructorDeclarationTest extends ParserDiagnosticsTest {
   void test_firstTokenAfterCommentAndMetadata_all_inverted() {
-    Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
-    externalKeyword.offset = 14;
-    var declaration = AstTestFactory.constructorDeclaration2(
-        Keyword.CONST,
-        Keyword.FACTORY,
-        AstTestFactory.identifier3('int'),
-        null,
-        AstTestFactory.formalParameterList(),
-        [],
-        AstTestFactory.emptyFunctionBody());
-    declaration.externalKeyword = externalKeyword;
-    declaration.constKeyword!.offset = 8;
-    Token factoryKeyword = declaration.factoryKeyword!;
-    factoryKeyword.offset = 0;
-    expect(declaration.firstTokenAfterCommentAndMetadata, factoryKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  factory const external A();
+}
+''');
+    parseResult.assertErrors([
+      error(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 20, 5),
+      error(ParserErrorCode.MODIFIER_OUT_OF_ORDER, 26, 8),
+    ]);
+
+    final node = parseResult.findNode.constructor('A()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.factoryKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_all_normal() {
-    Token token = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
-    token.offset = 0;
-    var declaration = AstTestFactory.constructorDeclaration2(
-        Keyword.CONST,
-        Keyword.FACTORY,
-        AstTestFactory.identifier3('int'),
-        null,
-        AstTestFactory.formalParameterList(),
-        [],
-        AstTestFactory.emptyFunctionBody());
-    declaration.externalKeyword = token;
-    declaration.constKeyword!.offset = 9;
-    declaration.factoryKeyword!.offset = 15;
-    expect(declaration.firstTokenAfterCommentAndMetadata, token);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  external const factory A();
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.constructor('A()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_constOnly() {
-    ConstructorDeclaration declaration = AstTestFactory.constructorDeclaration2(
-        Keyword.CONST,
-        null,
-        AstTestFactory.identifier3('int'),
-        null,
-        AstTestFactory.formalParameterList(),
-        [],
-        AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.constKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  const A();
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.constructor('A()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.constKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_externalOnly() {
-    Token externalKeyword = TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
-    var declaration = AstTestFactory.constructorDeclaration2(
-        null,
-        null,
-        AstTestFactory.identifier3('int'),
-        null,
-        AstTestFactory.formalParameterList(),
-        [],
-        AstTestFactory.emptyFunctionBody());
-    declaration.externalKeyword = externalKeyword;
-    expect(declaration.firstTokenAfterCommentAndMetadata, externalKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  external A();
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.constructor('A()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_factoryOnly() {
-    ConstructorDeclaration declaration = AstTestFactory.constructorDeclaration2(
-        null,
-        Keyword.FACTORY,
-        AstTestFactory.identifier3('int'),
-        null,
-        AstTestFactory.formalParameterList(),
-        [],
-        AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.factoryKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  factory A() => throw 0;
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.constructor('A()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.factoryKeyword);
   }
 }
 
@@ -991,48 +982,65 @@
 }
 
 @reflectiveTest
-class MethodDeclarationTest {
+class MethodDeclarationTest extends ParserDiagnosticsTest {
   void test_firstTokenAfterCommentAndMetadata_external() {
-    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        external: true, name: 'm', body: AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.externalKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  external void foo();
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.methodDeclaration('foo()');
+    expect(node.firstTokenAfterCommentAndMetadata, node.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_external_getter() {
-    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        external: true,
-        property: Keyword.GET,
-        name: 'm',
-        body: AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.externalKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  external get foo;
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.methodDeclaration('get foo');
+    expect(node.firstTokenAfterCommentAndMetadata, node.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_external_operator() {
-    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        external: true,
-        operator: true,
-        name: 'm',
-        body: AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.externalKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  external operator +(int other);
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.methodDeclaration('external operator');
+    expect(node.firstTokenAfterCommentAndMetadata, node.externalKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_getter() {
-    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        property: Keyword.GET,
-        name: 'm',
-        body: AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.propertyKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  get foo => 0;
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.methodDeclaration('get foo');
+    expect(node.firstTokenAfterCommentAndMetadata, node.propertyKeyword);
   }
 
   void test_firstTokenAfterCommentAndMetadata_operator() {
-    MethodDeclaration declaration = AstTestFactory.methodDeclaration4(
-        operator: true, name: 'm', body: AstTestFactory.emptyFunctionBody());
-    expect(declaration.firstTokenAfterCommentAndMetadata,
-        declaration.operatorKeyword);
+    final parseResult = parseStringWithErrors(r'''
+class A {
+  operator +(int other) => 0;
+}
+''');
+    parseResult.assertNoErrors();
+
+    final node = parseResult.findNode.methodDeclaration('operator');
+    expect(node.firstTokenAfterCommentAndMetadata, node.operatorKeyword);
   }
 }
 
@@ -2207,6 +2215,14 @@
 }
 
 class _AstTest {
+  ParseStringResult parseStringWithErrors(String content) {
+    return parseString(
+      content: content,
+      featureSet: FeatureSets.latestWithExperiments,
+      throwIfDiagnostics: false,
+    );
+  }
+
   FindNode _parseStringToFindNode(String content) {
     var parseResult = parseString(
       content: content,
diff --git a/pkg/analyzer/test/error/error_reporter_test.dart b/pkg/analyzer/test/error/error_reporter_test.dart
index d83df43..5777af9 100644
--- a/pkg/analyzer/test/error/error_reporter_test.dart
+++ b/pkg/analyzer/test/error/error_reporter_test.dart
@@ -97,7 +97,7 @@
 
     var reporter = ErrorReporter(
       listener,
-      firstType.element.source,
+      firstType.element2.source,
       isNonNullableByDefault: false,
     );
 
@@ -136,7 +136,7 @@
 
     var reporter = ErrorReporter(
       listener,
-      firstType.element.source,
+      firstType.element2.source,
       isNonNullableByDefault: false,
     );
     reporter.reportErrorForNode(
diff --git a/pkg/analyzer/test/generated/elements_types_mixin.dart b/pkg/analyzer/test/generated/elements_types_mixin.dart
index 8b660f5..b8a11e6 100644
--- a/pkg/analyzer/test/generated/elements_types_mixin.dart
+++ b/pkg/analyzer/test/generated/elements_types_mixin.dart
@@ -33,17 +33,17 @@
   }
 
   InterfaceType get doubleNone {
-    var element = typeProvider.doubleType.element;
+    var element = typeProvider.doubleType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get doubleQuestion {
-    var element = typeProvider.doubleType.element;
+    var element = typeProvider.doubleType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get doubleStar {
-    var element = typeProvider.doubleType.element;
+    var element = typeProvider.doubleType.element2;
     return interfaceTypeStar(element);
   }
 
@@ -52,32 +52,32 @@
   DynamicTypeImpl get dynamicType => DynamicTypeImpl.instance;
 
   InterfaceType get functionNone {
-    var element = typeProvider.functionType.element;
+    var element = typeProvider.functionType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get functionQuestion {
-    var element = typeProvider.functionType.element;
+    var element = typeProvider.functionType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get functionStar {
-    var element = typeProvider.functionType.element;
+    var element = typeProvider.functionType.element2;
     return interfaceTypeStar(element);
   }
 
   InterfaceType get intNone {
-    var element = typeProvider.intType.element;
+    var element = typeProvider.intType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get intQuestion {
-    var element = typeProvider.intType.element;
+    var element = typeProvider.intType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get intStar {
-    var element = typeProvider.intType.element;
+    var element = typeProvider.intType.element2;
     return interfaceTypeStar(element);
   }
 
@@ -88,62 +88,62 @@
   NeverTypeImpl get neverStar => NeverTypeImpl.instanceLegacy;
 
   InterfaceTypeImpl get nullNone {
-    var element = typeProvider.nullType.element;
+    var element = typeProvider.nullType.element2;
     return interfaceTypeNone(element) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl get nullQuestion {
-    var element = typeProvider.nullType.element;
+    var element = typeProvider.nullType.element2;
     return interfaceTypeQuestion(element) as InterfaceTypeImpl;
   }
 
   InterfaceTypeImpl get nullStar {
-    var element = typeProvider.nullType.element;
+    var element = typeProvider.nullType.element2;
     return interfaceTypeStar(element) as InterfaceTypeImpl;
   }
 
   InterfaceType get numNone {
-    var element = typeProvider.numType.element;
+    var element = typeProvider.numType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get numQuestion {
-    var element = typeProvider.numType.element;
+    var element = typeProvider.numType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get numStar {
-    var element = typeProvider.numType.element;
+    var element = typeProvider.numType.element2;
     return interfaceTypeStar(element);
   }
 
   InterfaceType get objectNone {
-    var element = typeProvider.objectType.element;
+    var element = typeProvider.objectType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get objectQuestion {
-    var element = typeProvider.objectType.element;
+    var element = typeProvider.objectType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get objectStar {
-    var element = typeProvider.objectType.element;
+    var element = typeProvider.objectType.element2;
     return interfaceTypeStar(element);
   }
 
   InterfaceType get stringNone {
-    var element = typeProvider.stringType.element;
+    var element = typeProvider.stringType.element2;
     return interfaceTypeNone(element);
   }
 
   InterfaceType get stringQuestion {
-    var element = typeProvider.stringType.element;
+    var element = typeProvider.stringType.element2;
     return interfaceTypeQuestion(element);
   }
 
   InterfaceType get stringStar {
-    var element = typeProvider.stringType.element;
+    var element = typeProvider.stringType.element2;
     return interfaceTypeStar(element);
   }
 
@@ -311,7 +311,7 @@
   }
 
   InterfaceType interfaceTypeNone(
-    ClassElement element, {
+    InterfaceElement element, {
     List<DartType> typeArguments = const [],
   }) {
     return element.instantiate(
@@ -321,7 +321,7 @@
   }
 
   InterfaceType interfaceTypeQuestion(
-    ClassElement element, {
+    InterfaceElement element, {
     List<DartType> typeArguments = const [],
   }) {
     return element.instantiate(
@@ -331,7 +331,7 @@
   }
 
   InterfaceType interfaceTypeStar(
-    ClassElement element, {
+    InterfaceElement element, {
     List<DartType> typeArguments = const [],
   }) {
     return element.instantiate(
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index c9978a9..9d90aad 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -371,7 +371,8 @@
     var exp = stmt.expression as InstanceCreationExpression;
     ClassElement elementB = AstFinder.getClass(unit, "B").declaredElement!;
     ClassElement elementA = AstFinder.getClass(unit, "A").declaredElement!;
-    expect(exp.constructorName.type.typeOrThrow.element, elementB);
+    final type = exp.constructorName.type.typeOrThrow as InterfaceType;
+    expect(type.element2, elementB);
     _isInstantiationOf(_hasElement(elementB))([
       _isType(elementA.typeParameters[0]
           .instantiate(nullabilitySuffix: NullabilitySuffix.star))
diff --git a/pkg/analyzer/test/id_tests/inheritance_test.dart b/pkg/analyzer/test/id_tests/inheritance_test.dart
index e178ad1..92de9e2 100644
--- a/pkg/analyzer/test/id_tests/inheritance_test.dart
+++ b/pkg/analyzer/test/id_tests/inheritance_test.dart
@@ -36,7 +36,7 @@
 
 String supertypeToString(InterfaceType type) {
   var sb = StringBuffer();
-  sb.write(type.element.name);
+  sb.write(type.element2.name);
   if (type.typeArguments.isNotEmpty) {
     sb.write('<');
     var comma = '';
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index dca066b..fdd27ee 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -48,7 +48,7 @@
 
   /// Test that [argumentList] has exactly two type items `int` and `double`.
   void assertTypeArguments(
-      TypeArgumentList argumentList, List<DartType> expectedTypes) {
+      TypeArgumentList argumentList, List<InterfaceType> expectedTypes) {
     expect(argumentList.arguments, hasLength(expectedTypes.length));
     for (int i = 0; i < expectedTypes.length; i++) {
       _assertNamedTypeSimple(argumentList.arguments[i], expectedTypes[i]);
@@ -748,7 +748,7 @@
       expect(target.staticType, typeProvider.numType);
 
       var intName = asExpression.type as NamedType;
-      expect(intName.name.staticElement, typeProvider.intType.element);
+      expect(intName.name.staticElement, typeProvider.intType.element2);
       expect(intName.name.staticType, isNull);
     }
   }
@@ -3837,7 +3837,7 @@
     expect(target.staticType, dynamicType);
 
     var numName = isExpression.type as NamedType;
-    expect(numName.name.staticElement, typeProvider.numType.element);
+    expect(numName.name.staticElement, typeProvider.numType.element2);
     expect(numName.name.staticType, isNull);
   }
 
@@ -3857,7 +3857,7 @@
     expect(target.staticType, dynamicType);
 
     var numName = isExpression.type as NamedType;
-    expect(numName.name.staticElement, typeProvider.numType.element);
+    expect(numName.name.staticElement, typeProvider.numType.element2);
     expect(numName.name.staticType, isNull);
   }
 
@@ -3967,7 +3967,7 @@
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
-    expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
+    expect(fReturnTypeNode.name.staticElement, same(doubleType.element2));
     expect(fReturnTypeNode.type, doubleType);
 
     expect(fExpression.declaredElement, same(fElement));
@@ -4202,7 +4202,7 @@
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
-    expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
+    expect(fReturnTypeNode.name.staticElement, same(doubleType.element2));
     expect(fReturnTypeNode.type, doubleType);
 
     expect(fExpression.declaredElement, same(fElement));
@@ -4298,7 +4298,7 @@
     expect(fNode.name.staticType, isNull);
 
     var fReturnTypeNode = fNode.returnType as NamedType;
-    expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
+    expect(fReturnTypeNode.name.staticElement, same(doubleType.element2));
     expect(fReturnTypeNode.type, doubleType);
 
     expect(fExpression.declaredElement, same(fElement));
@@ -4973,7 +4973,7 @@
     expect(vNamedType.type, typeProvider.numType);
 
     var vTypeIdentifier = vNamedType.name as SimpleIdentifier;
-    expect(vTypeIdentifier.staticElement, typeProvider.numType.element);
+    expect(vTypeIdentifier.staticElement, typeProvider.numType.element2);
     expect(vTypeIdentifier.staticType, isNull);
 
     // ignore: deprecated_member_use_from_same_package
@@ -5151,7 +5151,7 @@
     expect(methodDeclaration.name.staticType, isNull);
 
     var fReturnTypeNode = methodDeclaration.returnType as NamedType;
-    expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
+    expect(fReturnTypeNode.name.staticElement, same(doubleType.element2));
     expect(fReturnTypeNode.type, doubleType);
     //
     // Validate the parameters at the declaration site.
@@ -5567,7 +5567,8 @@
     var fooInvocation = fooStatement.expression as MethodInvocation;
     assertInvokeType(fooInvocation, 'T Function(C<T>)');
     assertType(fooInvocation.staticType, 'T');
-    expect(fooInvocation.typeOrThrow.element, same(tElement));
+    final type = fooInvocation.typeOrThrow as TypeParameterType;
+    expect(type.element, same(tElement));
   }
 
   test_methodInvocation_topLevelFunction() async {
@@ -5628,14 +5629,14 @@
         var typeArgument = typeArguments[0] as NamedType;
         InterfaceType boolType = typeProvider.boolType;
         expect(typeArgument.type, boolType);
-        expect(typeArgument.name.staticElement, boolType.element);
+        expect(typeArgument.name.staticElement, boolType.element2);
         expect(typeArgument.name.staticType, boolType);
       }
       {
         var typeArgument = typeArguments[1] as NamedType;
         InterfaceType stringType = typeProvider.stringType;
         expect(typeArgument.type, stringType);
-        expect(typeArgument.name.staticElement, stringType.element);
+        expect(typeArgument.name.staticElement, stringType.element2);
         expect(typeArgument.name.staticType, stringType);
       }
 
@@ -7090,8 +7091,8 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
     InterfaceType intType = typeProvider.intType;
-    ClassElement doubleElement = doubleType.element;
-    ClassElement intElement = intType.element;
+    final doubleElement = doubleType.element2;
+    final intElement = intType.element2;
 
     var cNode = result.unit.declarations[0] as ClassDeclaration;
     ClassElement cElement = cNode.declaredElement!;
@@ -7218,8 +7219,8 @@
 
     InterfaceType doubleType = typeProvider.doubleType;
     InterfaceType intType = typeProvider.intType;
-    ClassElement doubleElement = doubleType.element;
-    ClassElement intElement = intType.element;
+    final doubleElement = doubleType.element2;
+    final intElement = intType.element2;
 
     // topFunction()
     {
@@ -7523,7 +7524,7 @@
     expect(fDeclaration.name.staticType, isNull);
 
     var fReturnTypeNode = fDeclaration.returnType as NamedType;
-    expect(fReturnTypeNode.name.staticElement, same(doubleType.element));
+    expect(fReturnTypeNode.name.staticElement, same(doubleType.element2));
     expect(fReturnTypeNode.type, doubleType);
     //
     // Validate the parameters at the declaration site.
@@ -7801,7 +7802,6 @@
     expect(type.type, isDynamicType);
     var namedType = type.name;
     assertTypeNull(namedType);
-    expect(namedType.staticElement, same(typeProvider.dynamicType.element));
   }
 
   test_type_functionTypeAlias() async {
@@ -7920,7 +7920,7 @@
     {
       var statement = statements[0] as ExpressionStatement;
       var identifier = statement.expression as SimpleIdentifier;
-      expect(identifier.staticElement, same(typeProvider.intType.element));
+      expect(identifier.staticElement, same(typeProvider.intType.element2));
       expect(identifier.staticType, typeProvider.typeType);
     }
 
@@ -8646,12 +8646,12 @@
     }
   }
 
-  void _assertNamedTypeSimple(TypeAnnotation namedType, DartType type) {
+  void _assertNamedTypeSimple(TypeAnnotation namedType, InterfaceType type) {
     namedType as NamedType;
     expect(namedType.type, type);
 
     var identifier = namedType.name as SimpleIdentifier;
-    expect(identifier.staticElement, same(type.element));
+    expect(identifier.staticElement, same(type.element2));
     expect(identifier.staticType, isNull);
   }
 
@@ -8681,7 +8681,13 @@
     var namedType = node.type as NamedType?;
     if (namedType != null) {
       expect(namedType.type, type);
-      expect(namedType.name.staticElement, same(type!.element));
+      if (type is InterfaceType) {
+        expect(namedType.name.staticElement, same(type.element2));
+      } else if (type is TypeParameterType) {
+        expect(namedType.name.staticElement, same(type.element));
+      } else {
+        throw UnimplementedError();
+      }
     }
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 06f8192..92ec357 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2443,8 +2443,8 @@
     var c = _getTopLevelVar(result.unit, 'c');
     var typeC = c.declaredElement!.type as InterfaceType;
     // The class C has an old field 'foo', not the new 'bar'.
-    expect(typeC.element.getField('foo'), isNotNull);
-    expect(typeC.element.getField('bar'), isNull);
+    expect(typeC.element2.getField('foo'), isNotNull);
+    expect(typeC.element2.getField('bar'), isNull);
   }
 
   test_importOfNonLibrary_part_afterLibrary() async {
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index dcb1633..bff08f3 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -123,7 +123,7 @@
 class A {}
 ''');
     ClassElement elementA = findElement.class_('A');
-    ClassElement elementObject = elementA.supertype!.element;
+    final elementObject = elementA.supertype!.element2;
     assertThat(elementObject).isExtendedAt('A {}', true, length: 0);
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index 14a0870..f173919 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart' hide Declaration;
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/test_utilities/find_element.dart';
@@ -532,7 +533,8 @@
 
     var v1 = findElement.topVar('v1');
     var v2 = findElement.topVar('v2');
-    var randomElement = v1.type.element as ClassElement;
+    final v1Type = v1.type as InterfaceType;
+    var randomElement = v1Type.element2 as ClassElement;
     var expected = [
       _expectId(v1, SearchResultKind.REFERENCE, 'Random v1;'),
       _expectId(v2, SearchResultKind.REFERENCE, 'Random v2;'),
diff --git a/pkg/analyzer/test/src/dart/analysis/session_test.dart b/pkg/analyzer/test/src/dart/analysis/session_test.dart
index 9c13ede..0dde953 100644
--- a/pkg/analyzer/test/src/dart/analysis/session_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/session_test.dart
@@ -341,7 +341,7 @@
     var resolvedUnit =
         await session.getResolvedUnit(test.path) as ResolvedUnitResult;
     var typeProvider = resolvedUnit.typeProvider;
-    var intClass = typeProvider.intType.element;
+    var intClass = typeProvider.intType.element2;
 
     var parsedLibrary = session.getParsedLibraryValid(test.path);
 
@@ -564,7 +564,7 @@
     expect(resolvedLibrary.session, session);
 
     var typeProvider = resolvedLibrary.typeProvider;
-    expect(typeProvider.intType.element.name, 'int');
+    expect(typeProvider.intType.element2.name, 'int');
 
     var libraryElement = resolvedLibrary.element;
 
@@ -612,7 +612,7 @@
     var resolvedLibrary = await session.getResolvedLibraryValid(test.path);
 
     expect(() {
-      var intClass = resolvedLibrary.typeProvider.intType.element;
+      var intClass = resolvedLibrary.typeProvider.intType.element2;
       resolvedLibrary.getElementDeclaration(intClass);
     }, throwsArgumentError);
   }
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index a40cbfd..2be9ce0 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -15,6 +15,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../../util/feature_sets.dart';
+import '../../diagnostics/parser_diagnostics.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -23,7 +24,7 @@
 }
 
 @reflectiveTest
-class ToSourceVisitorTest {
+class ToSourceVisitorTest extends ParserDiagnosticsTest {
   void test_visitAdjacentStrings() {
     var findNode = _parseStringToFindNode(r'''
 var v = 'a' 'b';
@@ -944,15 +945,31 @@
   }
 
   void test_visitDoubleLiteral() {
-    _assertSource("4.2", AstTestFactory.doubleLiteral(4.2));
+    final code = '3.14';
+    final findNode = _parseStringToFindNode('''
+final x = $code;
+''');
+    _assertSource(code, findNode.doubleLiteral(code));
   }
 
   void test_visitEmptyFunctionBody() {
-    _assertSource(";", AstTestFactory.emptyFunctionBody());
+    final code = ';';
+    final findNode = _parseStringToFindNode('''
+void f() {
+  ;
+}
+''');
+    _assertSource(code, findNode.emptyStatement(code));
   }
 
   void test_visitEmptyStatement() {
-    _assertSource(";", AstTestFactory.emptyStatement());
+    final code = ';';
+    final findNode = _parseStringToFindNode('''
+abstract class A {
+  void foo();
+}
+''');
+    _assertSource(code, findNode.emptyFunctionBody(code));
   }
 
   void test_visitEnumDeclaration_constant_arguments_named() {
@@ -1081,22 +1098,28 @@
   }
 
   void test_visitExpressionFunctionBody_async() {
-    _assertSource(
-        "async => a;",
-        AstTestFactory.asyncExpressionFunctionBody(
-            AstTestFactory.identifier3("a")));
+    final code = 'async => 0;';
+    final findNode = _parseStringToFindNode('''
+void f() $code
+''');
+    _assertSource(code, findNode.expressionFunctionBody(code));
   }
 
   void test_visitExpressionFunctionBody_async_star() {
-    _assertSource(
-        "async* => a;",
-        AstTestFactory.asyncGeneratorExpressionFunctionBody(
-            AstTestFactory.identifier3("a")));
+    final code = 'async* => 0;';
+    final parseResult = parseStringWithErrors('''
+void f() $code
+''');
+    final node = parseResult.findNode.expressionFunctionBody(code);
+    _assertSource(code, node);
   }
 
   void test_visitExpressionFunctionBody_simple() {
-    _assertSource("=> a;",
-        AstTestFactory.expressionFunctionBody(AstTestFactory.identifier3("a")));
+    final code = '=> 0;';
+    final findNode = _parseStringToFindNode('''
+void f() $code
+''');
+    _assertSource(code, findNode.expressionFunctionBody(code));
   }
 
   void test_visitExpressionStatement() {
@@ -1877,15 +1900,9 @@
   }
 
   void test_visitFunctionDeclaration_external() {
-    var functionDeclaration = AstTestFactory.functionDeclaration(
-        null,
-        null,
-        "f",
-        AstTestFactory.functionExpression2(AstTestFactory.formalParameterList(),
-            AstTestFactory.emptyFunctionBody()));
-    functionDeclaration.externalKeyword =
-        TokenFactory.tokenFromKeyword(Keyword.EXTERNAL);
-    _assertSource("external f();", functionDeclaration);
+    final code = 'external void f();';
+    final findNode = _parseStringToFindNode(code);
+    _assertSource(code, findNode.functionDeclaration(code));
   }
 
   void test_visitFunctionDeclaration_getter() {
@@ -3514,6 +3531,7 @@
     expect(buffer.toString(), expectedSource);
   }
 
+  /// TODO(scheglov) Use [parseStringWithErrors] everywhere? Or just there?
   FindNode _parseStringToFindNode(String content) {
     var parseResult = parseString(
       content: content,
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 0bf2ac3..876de8d 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -927,7 +927,7 @@
   void test_getElement() {
     ClassElementImpl typeElement = class_(name: 'A');
     InterfaceType type = interfaceTypeStar(typeElement);
-    expect(type.element, typeElement);
+    expect(type.element2, typeElement);
   }
 
   void test_getGetter_implemented() {
@@ -1026,7 +1026,7 @@
     List<InterfaceType> interfaces = typeBI.interfaces;
     expect(interfaces, hasLength(1));
     InterfaceType result = interfaces[0];
-    expect(result.element, same(A));
+    expect(result.element2, same(A));
     expect(result.typeArguments[0], same(typeI));
   }
 
@@ -1138,7 +1138,7 @@
     List<InterfaceType> interfaces = typeBI.mixins;
     expect(interfaces, hasLength(1));
     InterfaceType result = interfaces[0];
-    expect(result.element, same(A));
+    expect(result.element2, same(A));
     expect(result.typeArguments[0], same(typeI));
   }
 
@@ -1223,7 +1223,7 @@
     var typeI = interfaceTypeStar(class_(name: 'I'));
     var typeBI = interfaceTypeStar(classB, typeArguments: <DartType>[typeI]);
     InterfaceType superclass = typeBI.superclass!;
-    expect(superclass.element, same(A));
+    expect(superclass.element2, same(A));
     expect(superclass.typeArguments[0], same(typeI));
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
index 3cbb36f..89a3ffb 100644
--- a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -1329,7 +1329,7 @@
 class A {}
 ''');
     var member = manager.getMember2(
-      typeProvider.objectType.element,
+      typeProvider.objectType.element2,
       Name(null, 'hashCode'),
       forSuper: true,
     );
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
index c5e85ce..f4231d7 100644
--- a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -173,7 +173,7 @@
   }
 
   void test_class_object() {
-    expect(_longestPathToObject(typeProvider.objectType.element), 0);
+    expect(_longestPathToObject(typeProvider.objectType.element2), 0);
   }
 
   void test_class_recursion() {
@@ -344,7 +344,7 @@
     expect(_longestPathToObject(M), 3);
   }
 
-  int _longestPathToObject(ClassElement element) {
+  int _longestPathToObject(InterfaceElement element) {
     return InterfaceLeastUpperBoundHelper.computeLongestInheritancePathToObject(
         element);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index b1ea604c..164479e 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -137,7 +137,9 @@
 
     expect(element.supertype, isNull);
     expect(element.isAbstract, isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(element.isEnum, isFalse);
+    // ignore: deprecated_member_use_from_same_package
     expect(element.isMixin, isTrue);
     expect(element.isMixinApplication, isFalse);
     expect(element.thisType.isDartCoreObject, isFalse);
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index f386b87..4d9ad77 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -43,17 +43,18 @@
 
   ClassElement get boolElement => typeProvider.boolElement;
 
-  ClassElement get doubleElement => typeProvider.doubleType.element;
+  ClassElement get doubleElement => typeProvider.doubleElement;
 
   InterfaceType get doubleType => typeProvider.doubleType;
 
-  Element get dynamicElement => typeProvider.dynamicType.element!;
+  Element get dynamicElement =>
+      (typeProvider.dynamicType as DynamicTypeImpl).element;
 
   FeatureSet get featureSet => result.libraryElement.featureSet;
 
   ClassElement get futureElement => typeProvider.futureElement;
 
-  ClassElement get intElement => typeProvider.intType.element;
+  ClassElement get intElement => typeProvider.intElement;
 
   InterfaceType get intType => typeProvider.intType;
 
@@ -69,13 +70,14 @@
 
   NeverElementImpl get neverElement => NeverElementImpl.instance;
 
-  ClassElement get numElement => typeProvider.numType.element;
+  ClassElement get numElement => typeProvider.numElement;
 
-  ClassElement get objectElement => typeProvider.objectType.element;
+  ClassElement get objectElement =>
+      typeProvider.objectType.element2 as ClassElement;
 
   InterfaceType get objectType => typeProvider.objectType;
 
-  ClassElement get stringElement => typeProvider.stringType.element;
+  ClassElement get stringElement => typeProvider.stringElement;
 
   InterfaceType get stringType => typeProvider.stringType;
 
diff --git a/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
index 7e64d5d..149fd91 100644
--- a/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
+++ b/pkg/analyzer/test/src/dart/resolver/legacy_type_asserter_test.dart
@@ -2,18 +2,15 @@
 // 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:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
-import 'package:analyzer/dart/element/type_provider.dart';
-import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/legacy_type_asserter.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../../../generated/test_analysis_context.dart';
-import '../../../util/feature_sets.dart';
+import '../resolution/context_collection_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -22,134 +19,117 @@
 }
 
 @reflectiveTest
-class LegacyTypeAsserterTest {
-  late final TypeProvider typeProvider;
+class LegacyTypeAsserterTest extends PubPackageResolutionTest {
+  InterfaceType get _intNone {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
 
-  void setUp() {
-    var analysisContext = TestAnalysisContext();
-    typeProvider = analysisContext.typeProviderLegacy;
+  InterfaceType get _intQuestion {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
+  InterfaceType get _intStar {
+    return typeProvider.intElement.instantiate(
+      typeArguments: const [],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
   }
 
   test_nullableUnit_expressionStaticType_bottom() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = NeverTypeImpl.instance;
+    await _buildUnit(() => NeverTypeImpl.instance);
     expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
+      LegacyTypeAsserter.assertLegacyTypes(result.unit);
     }, throwsStateError);
   }
 
   test_nullableUnit_expressionStaticType_bottomQuestion() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = NeverTypeImpl.instanceNullable;
-    LegacyTypeAsserter.assertLegacyTypes(unit);
+    await _buildUnit(() => NeverTypeImpl.instanceNullable);
+    LegacyTypeAsserter.assertLegacyTypes(result.unit);
   }
 
   test_nullableUnit_expressionStaticType_dynamic() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = typeProvider.dynamicType;
-    LegacyTypeAsserter.assertLegacyTypes(unit);
+    await _buildUnit(() => typeProvider.dynamicType);
+    LegacyTypeAsserter.assertLegacyTypes(result.unit);
   }
 
   test_nullableUnit_expressionStaticType_nonNull() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = (typeProvider.intType as TypeImpl)
-        .withNullability(NullabilitySuffix.none);
+    await _buildUnit(() => _intNone);
     expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
+      LegacyTypeAsserter.assertLegacyTypes(result.unit);
     }, throwsStateError);
   }
 
   test_nullableUnit_expressionStaticType_nonNullTypeArgument() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = typeProvider.listType(
-        (typeProvider.intType as TypeImpl)
-            .withNullability(NullabilitySuffix.question));
-
+    await _buildUnit(
+      () => typeProvider.listElement.instantiate(
+        typeArguments: [_intNone],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+    );
     expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
+      LegacyTypeAsserter.assertLegacyTypes(result.unit);
     }, throwsStateError);
   }
 
   test_nullableUnit_expressionStaticType_nonNullTypeParameter() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = typeProvider.listElement.instantiate(
-      typeArguments: [
-        TypeParameterElementImpl('E', 0).instantiate(
-          nullabilitySuffix: NullabilitySuffix.none,
-        ),
-      ],
-      nullabilitySuffix: NullabilitySuffix.none,
+    await _buildUnit(
+      () => typeProvider.listElement.instantiate(
+        typeArguments: [
+          findElement.typeParameter('T').instantiate(
+                nullabilitySuffix: NullabilitySuffix.none,
+              ),
+        ],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
     );
     expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
-    }, throwsStateError);
-  }
-
-  test_nullableUnit_expressionStaticType_nonNullTypeParameterBound() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    var T = TypeParameterElementImpl.synthetic('T');
-    T.bound = (typeProvider.intType as TypeImpl)
-        .withNullability(NullabilitySuffix.none);
-    identifier.staticType = TypeParameterTypeImpl(
-      element: T,
-      nullabilitySuffix: NullabilitySuffix.star,
-    );
-    expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
+      LegacyTypeAsserter.assertLegacyTypes(result.unit);
     }, throwsStateError);
   }
 
   test_nullableUnit_expressionStaticType_null() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = typeProvider.nullType;
-    LegacyTypeAsserter.assertLegacyTypes(unit);
+    await _buildUnit(
+      () => typeProvider.nullElement.instantiate(
+        typeArguments: [],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+    );
+    LegacyTypeAsserter.assertLegacyTypes(result.unit);
   }
 
   test_nullableUnit_expressionStaticType_question() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = (typeProvider.intType as TypeImpl)
-        .withNullability(NullabilitySuffix.question);
+    await _buildUnit(() => _intQuestion);
     expect(() {
-      LegacyTypeAsserter.assertLegacyTypes(unit);
+      LegacyTypeAsserter.assertLegacyTypes(result.unit);
     }, throwsStateError);
   }
 
   test_nullableUnit_expressionStaticType_star() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = (typeProvider.intType as TypeImpl)
-        .withNullability(NullabilitySuffix.star);
-    LegacyTypeAsserter.assertLegacyTypes(unit);
+    await _buildUnit(() => _intStar);
+    LegacyTypeAsserter.assertLegacyTypes(result.unit);
   }
 
   test_nullableUnit_expressionStaticType_void() async {
-    var identifier = AstTestFactory.identifier3('foo');
-    var unit = _wrapExpression(identifier);
-    identifier.staticType = VoidTypeImpl.instance;
-    LegacyTypeAsserter.assertLegacyTypes(unit);
+    await _buildUnit(() => typeProvider.voidType);
+    LegacyTypeAsserter.assertLegacyTypes(result.unit);
   }
 
-  CompilationUnit _wrapExpression(Expression e, {bool nonNullable = false}) {
-    return AstTestFactory.compilationUnit9(
-      declarations: [
-        AstTestFactory.functionDeclaration(
-            null,
-            null,
-            'f',
-            AstTestFactory.functionExpression2(
-                AstTestFactory.formalParameterList(),
-                AstTestFactory.expressionFunctionBody(e)))
-      ],
-      featureSet: nonNullable ? FeatureSets.latest : FeatureSets.language_2_9,
-    );
+  Future<void> _buildUnit(DartType Function() getType) async {
+    await resolveTestCode(r'''
+// @dart = 2.9
+void f<T>(Object? foo) {
+  foo;
+}
+''');
+
+    final foo = findNode.simple('foo;');
+    foo as SimpleIdentifierImpl;
+    foo.staticType = getType();
   }
 }
diff --git a/pkg/analyzer/test/src/lint/lint_rule_test.dart b/pkg/analyzer/test/src/lint/lint_rule_test.dart
index 4bfee29..07eb259 100644
--- a/pkg/analyzer/test/src/lint/lint_rule_test.dart
+++ b/pkg/analyzer/test/src/lint/lint_rule_test.dart
@@ -45,7 +45,9 @@
             CollectingReporter(GatheringErrorListener(), _MockSource('mock'));
         rule.reporter = reporter;
 
-        final node = EmptyStatementImpl(SimpleToken(TokenType.SEMICOLON, 0));
+        final node = EmptyStatementImpl(
+          semicolon: SimpleToken(TokenType.SEMICOLON, 0),
+        );
         rule.reportLint(node, errorCode: customCode);
         expect(reporter.code, customCode);
       });
@@ -55,7 +57,9 @@
             CollectingReporter(GatheringErrorListener(), _MockSource('mock'));
         rule.reporter = reporter;
 
-        final node = EmptyStatementImpl(SimpleToken(TokenType.SEMICOLON, 0));
+        final node = EmptyStatementImpl(
+          semicolon: SimpleToken(TokenType.SEMICOLON, 0),
+        );
         rule.reportLint(node);
         expect(reporter.code, rule.lintCode);
       });
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 3eb5228..83acdeb 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -291,8 +291,9 @@
 
   void _writeClassElement(InterfaceElement e) {
     _writeIndentedLine(() {
-      if (e is ClassElement) {
-        _writeIf(e.isAbstract && !e.isMixin, 'abstract ');
+      // TODO(scheglov) `is! MixinElement` after the separation.
+      if (e is ClassElement && e is! MixinElement) {
+        _writeIf(e.isAbstract, 'abstract ');
         _writeIf(e.isMacro, 'macro ');
       }
       _writeIf(!e.isSimplyBounded, 'notSimplyBounded ');
@@ -324,7 +325,7 @@
         supertype = e.supertype;
       }
       if (supertype != null &&
-          (supertype.element.name != 'Object' || e.mixins.isNotEmpty)) {
+          (supertype.element2.name != 'Object' || e.mixins.isNotEmpty)) {
         _writeType('supertype', supertype);
       }
 
@@ -961,11 +962,6 @@
 
       var aliasedType = e.aliasedType;
       _writeType('aliasedType', aliasedType);
-      // TODO(scheglov) https://github.com/dart-lang/sdk/issues/44629
-      // TODO(scheglov) Remove it when we stop providing it everywhere.
-      if (aliasedType is FunctionType) {
-        expect(aliasedType.element, isNull);
-      }
 
       var aliasedElement = e.aliasedElement;
       if (aliasedElement is GenericFunctionTypeElementImpl) {
diff --git a/pkg/analyzer/test/src/summary/elements_test.dart b/pkg/analyzer/test/src/summary/elements_test.dart
index 6fa83b4..b12f41d 100644
--- a/pkg/analyzer/test/src/summary/elements_test.dart
+++ b/pkg/analyzer/test/src/summary/elements_test.dart
@@ -21322,7 +21322,7 @@
             superConstructor: package:test/foo.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo.dart');
+    expect(typeA.element2.source.shortName, 'foo.dart');
   }
 
   test_exportImport_configurations_useFirst() async {
@@ -21355,7 +21355,7 @@
             superConstructor: package:test/foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_io.dart');
+    expect(typeA.element2.source.shortName, 'foo_io.dart');
   }
 
   test_exportImport_configurations_useSecond() async {
@@ -21388,7 +21388,7 @@
             superConstructor: package:test/foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_html.dart');
+    expect(typeA.element2.source.shortName, 'foo_html.dart');
   }
 
   test_exports() async {
@@ -23768,7 +23768,7 @@
             superConstructor: package:test/foo.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo.dart');
+    expect(typeA.element2.source.shortName, 'foo.dart');
   }
 
   test_import_configurations_useFirst() async {
@@ -23799,7 +23799,7 @@
             superConstructor: package:test/foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_io.dart');
+    expect(typeA.element2.source.shortName, 'foo_io.dart');
   }
 
   test_import_configurations_useFirst_eqTrue() async {
@@ -23830,7 +23830,7 @@
             superConstructor: package:test/foo_io.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_io.dart');
+    expect(typeA.element2.source.shortName, 'foo_io.dart');
   }
 
   test_import_configurations_useSecond() async {
@@ -23861,7 +23861,7 @@
             superConstructor: package:test/foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_html.dart');
+    expect(typeA.element2.source.shortName, 'foo_html.dart');
   }
 
   test_import_configurations_useSecond_eqTrue() async {
@@ -23892,7 +23892,7 @@
             superConstructor: package:test/foo_html.dart::@class::A::@constructor::•
 ''');
     var typeA = library.definingCompilationUnit.getType('B')!.supertype!;
-    expect(typeA.element.source.shortName, 'foo_html.dart');
+    expect(typeA.element2.source.shortName, 'foo_html.dart');
   }
 
   test_import_dartCore_explicit() async {
@@ -25330,7 +25330,7 @@
     // This test should verify that we correctly record inferred types,
     // when the type is defined in a part of an SDK library. So, test that
     // the type is actually in a part.
-    Element streamElement = p.type.element!;
+    final streamElement = (p.type as InterfaceType).element2;
     if (streamElement is ClassElement) {
       expect(streamElement.source, isNot(streamElement.library.source));
     }
diff --git a/pkg/analyzer/test/utils.dart b/pkg/analyzer/test/utils.dart
index 2adf9cd..850866e 100644
--- a/pkg/analyzer/test/utils.dart
+++ b/pkg/analyzer/test/utils.dart
@@ -196,7 +196,7 @@
 
   /// Assert that a type has the element that is equal to the [expected].
   Asserter<DartType> hasElement(Element expected) =>
-      (DartType type) => expect(expected, type.element);
+      (DartType type) => expect(expected, (type as InterfaceType).element2);
 
   /// Given assertions for the argument and return types, produce an
   /// assertion over unary function types.
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 9a17008..02ac771 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -1087,7 +1087,7 @@
       } else if (expectedType.isDartCoreString) {
         _addSingleCharacterName(excluded, res, $s);
       } else if (expectedType is InterfaceType) {
-        var className = expectedType.element.name;
+        var className = expectedType.element2.name;
         _addAll(excluded, res, _getCamelWordCombinations(className));
       }
     }
@@ -1102,7 +1102,7 @@
   DartType? _getVisibleType(DartType? type,
       {ExecutableElement? methodBeingCopied}) {
     if (type is InterfaceType) {
-      var element = type.element;
+      var element = type.element2;
       if (element.isPrivate &&
           !dartFileEditBuilder._isDefinedLocally(element)) {
         return null;
@@ -1254,7 +1254,7 @@
 
     if (type is InterfaceType) {
       _writeTypeElementArguments(
-        element: type.element,
+        element: type.element2,
         typeArguments: type.typeArguments,
         methodBeingCopied: methodBeingCopied,
       );
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index cb41470..2545739 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -213,10 +213,9 @@
   /// Convert the element kind of the [element] from the 'analyzer' package to
   /// an element kind defined by the plugin API.
   plugin.ElementKind _convertElementToElementKind(analyzer.Element element) {
-    if (element is analyzer.ClassElement && element.isEnum) {
+    if (element is analyzer.EnumElement) {
       return plugin.ElementKind.ENUM;
-    } else if (element is analyzer.FieldElement &&
-        element.isEnumConstant &&
+    } else if (element is analyzer.FieldElement && element.isEnumConstant
         // MyEnum.values and MyEnum.one.index return isEnumConstant = true
         // so these additional checks are necessary.
         // TODO(danrubel) MyEnum.values is constant, but is a list
@@ -225,8 +224,11 @@
         // so should it return isEnumConstant = true?
         // Or should we return ElementKind.ENUM_CONSTANT here
         // in either or both of these cases?
-        element.type.element == element.enclosingElement3) {
-      return plugin.ElementKind.ENUM_CONSTANT;
+        ) {
+      final type = element.type;
+      if (type is InterfaceType && type.element2 == element.enclosingElement3) {
+        return plugin.ElementKind.ENUM_CONSTANT;
+      }
     }
     return convertElementKind(element.kind);
   }
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
index 97b1c7f..151d387 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/type_member_contributor.dart
@@ -415,11 +415,11 @@
     // classes seen (not the interfaces) so that we won't be fooled by nonsense
     // like "class C<T> extends C<List<T>> {}"
     var result = <InterfaceType>[];
-    Set<ClassElement> classesSeen = HashSet<ClassElement>();
+    final classesSeen = <InterfaceElement>{};
     var typesToVisit = <InterfaceType>[type];
     while (typesToVisit.isNotEmpty) {
       var nextType = typesToVisit.removeLast();
-      if (!classesSeen.add(nextType.element)) {
+      if (!classesSeen.add(nextType.element2)) {
         // Class had already been seen, so ignore this type.
         continue;
       }
diff --git a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
index a1c5c55..20d8142 100644
--- a/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
+++ b/pkg/analyzer_plugin/lib/utilities/navigation/navigation_dart.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
@@ -328,9 +329,8 @@
       var token = node.keyword;
       if (token != null && token.keyword == Keyword.VAR) {
         var inferredType = node.declaredElement?.type;
-        var element = inferredType?.element;
-        if (element != null) {
-          computer._addRegionForToken(token, element);
+        if (inferredType is InterfaceType) {
+          computer._addRegionForToken(token, inferredType.element2);
         }
       }
     }
@@ -492,13 +492,18 @@
     /// the given list of [variables], or `null` if not all variable have the
     /// same inferred type.
     Element? getCommonElement(List<VariableDeclaration> variables) {
-      var firstElement = variables[0].declaredElement?.type.element;
-      if (firstElement == null) {
+      final firstType = variables[0].declaredElement?.type;
+      if (firstType is! InterfaceType) {
         return null;
       }
+
+      var firstElement = firstType.element2;
       for (var i = 1; i < variables.length; i++) {
-        var element = variables[1].declaredElement?.type.element;
-        if (element != firstElement) {
+        final type = variables[i].declaredElement?.type;
+        if (type is! InterfaceType) {
+          return null;
+        }
+        if (type.element2 != firstElement) {
           return null;
         }
       }
diff --git a/pkg/dartdev/lib/src/commands/devtools.dart b/pkg/dartdev/lib/src/commands/devtools.dart
index ecf7884..194836e 100644
--- a/pkg/dartdev/lib/src/commands/devtools.dart
+++ b/pkg/dartdev/lib/src/commands/devtools.dart
@@ -4,7 +4,6 @@
 
 import 'package:args/args.dart';
 import 'package:dds/devtools_server.dart';
-import 'package:dds/src/devtools/utils.dart';
 import 'package:path/path.dart' as path;
 
 import '../core.dart';
@@ -15,7 +14,7 @@
   DevToolsCommand({
     this.customDevToolsPath,
     bool verbose = false,
-  })  : _argParser = DevToolsServer.buildArgParser(
+  })  : argParser = DevToolsServer.buildArgParser(
           verbose: verbose,
           includeHelpOption: false,
           usageLineLength: dartdevUsageLineLength,
@@ -29,8 +28,7 @@
   final String? customDevToolsPath;
 
   @override
-  ArgParser get argParser => _argParser;
-  late final ArgParser _argParser;
+  final ArgParser argParser;
 
   @override
   String get name => 'devtools';
@@ -44,87 +42,16 @@
   @override
   Future<int> run() async {
     final args = argResults!;
-    final bool version = args[DevToolsServer.argVersion];
-    final bool machineMode = args[DevToolsServer.argMachine];
-    // launchBrowser defaults based on machine-mode if not explicitly supplied.
-    final bool launchBrowser = args.wasParsed(DevToolsServer.argLaunchBrowser)
-        ? args[DevToolsServer.argLaunchBrowser]
-        : !machineMode;
-    final bool enableNotifications =
-        args[DevToolsServer.argEnableNotifications];
-    final bool allowEmbedding = args.wasParsed(DevToolsServer.argAllowEmbedding)
-        ? args[DevToolsServer.argAllowEmbedding]
-        : true;
-
-    final port = args[DevToolsServer.argPort] != null
-        ? int.tryParse(args[DevToolsServer.argPort]) ?? 0
-        : 0;
-
-    final bool headlessMode = args[DevToolsServer.argHeadlessMode];
-    final bool debugMode = args[DevToolsServer.argDebugMode];
-
-    final numPortsToTry = args[DevToolsServer.argTryPorts] != null
-        ? int.tryParse(args[DevToolsServer.argTryPorts]) ?? 0
-        : DevToolsServer.defaultTryPorts;
-
-    final bool verboseMode = args[DevToolsServer.argVerbose];
-    final String? hostname = args[DevToolsServer.argHost];
-    final String? appSizeBase = args[DevToolsServer.argAppSizeBase];
-    final String? appSizeTest = args[DevToolsServer.argAppSizeTest];
 
     final sdkDir = path.dirname(sdk.dart);
     final fullSdk = sdkDir.endsWith('bin');
     final devToolsBinaries =
         fullSdk ? sdk.devToolsBinaries : path.absolute(sdkDir, 'devtools');
 
-    if (version) {
-      final versionStr = await DevToolsUtils.getVersion(devToolsBinaries);
-      DevToolsUtils.printOutput(
-        'Dart DevTools version $versionStr',
-        {
-          'version': versionStr,
-        },
-        machineMode: machineMode,
-      );
-      return 0;
-    }
-
-    // Prefer getting the VM URI from the rest args; fall back on the 'vm-url'
-    // option otherwise.
-    String? serviceProtocolUri;
-    if (args.rest.isNotEmpty) {
-      serviceProtocolUri = args.rest.first;
-    } else if (args.wasParsed(DevToolsServer.argVmUri)) {
-      serviceProtocolUri = args[DevToolsServer.argVmUri];
-    }
-
-    // Support collecting profile data.
-    String? profileFilename;
-    if (args.wasParsed(DevToolsServer.argProfileMemory)) {
-      profileFilename = args[DevToolsServer.argProfileMemory];
-    }
-    if (profileFilename != null && !path.isAbsolute(profileFilename)) {
-      profileFilename = path.absolute(profileFilename);
-    }
-
-    final server = await DevToolsServer().serveDevTools(
-      machineMode: machineMode,
-      debugMode: debugMode,
-      launchBrowser: launchBrowser,
-      enableNotifications: enableNotifications,
-      allowEmbedding: allowEmbedding,
-      port: port,
-      headlessMode: headlessMode,
-      numPortsToTry: numPortsToTry,
-      customDevToolsPath: customDevToolsPath ?? devToolsBinaries,
-      serviceProtocolUri: serviceProtocolUri,
-      profileFilename: profileFilename,
-      verboseMode: verboseMode,
-      hostname: hostname,
-      appSizeBase: appSizeBase,
-      appSizeTest: appSizeTest,
+    final server = await DevToolsServer().serveDevToolsWithArgs(
+      args.arguments,
+      customDevToolsPath: devToolsBinaries,
     );
-
     return server == null ? -1 : 0;
   }
 }
diff --git a/pkg/dds/tool/devtools_server/serve_local.dart b/pkg/dds/tool/devtools_server/serve_local.dart
index db893fe..86ac23a 100644
--- a/pkg/dds/tool/devtools_server/serve_local.dart
+++ b/pkg/dds/tool/devtools_server/serve_local.dart
@@ -10,7 +10,7 @@
 const argDevToolsBuild = 'devtools-build';
 
 void main(List<String> args) {
-  final argParser = ArgParser()
+  final argParser = DevToolsServer.buildArgParser()
     ..addOption(
       argDevToolsBuild,
       help: 'The location of the DevTools build to serve from DevTools server '
@@ -21,7 +21,8 @@
   try {
     final ArgResults argResults = argParser.parse(args);
     unawaited(
-      DevToolsServer().serveDevTools(
+      DevToolsServer().serveDevToolsWithArgs(
+        _removeDevToolsBuildOption(args),
         customDevToolsPath: argResults[argDevToolsBuild],
       ),
     );
@@ -31,3 +32,23 @@
     print(argParser.usage);
   }
 }
+
+/// Removes the --devtools-build option from [args].
+List<String> _removeDevToolsBuildOption(List<String> args) {
+  // Create a new list to mutate as the args list is fixed.
+  args = args.toList();
+
+  final option = '--$argDevToolsBuild';
+
+  // serve_local.dart --devtools-build foo
+  final index = args.indexOf(option);
+  if (index != -1) {
+    args.removeRange(index, index + 2);
+  }
+
+  // serve_local.dart --devtools-build=foo
+  // serve_local.dart --devtools-build="foo"
+  args.removeWhere((arg) => arg.startsWith('${option}='));
+
+  return args;
+}
diff --git a/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart b/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
index 5b04212..e393329 100644
--- a/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
+++ b/pkg/nnbd_migration/lib/src/already_migrated_code_decorator.dart
@@ -75,7 +75,7 @@
           namedParameters: namedParameters,
           positionalParameters: positionalParameters);
     } else if (type is InterfaceType) {
-      var typeParameters = type.element.typeParameters;
+      var typeParameters = type.element2.typeParameters;
       if (typeParameters.isNotEmpty) {
         assert(type.typeArguments.length == typeParameters.length);
         int index = 0;
diff --git a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
index 1baa2ce..4d7d3ce 100644
--- a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
@@ -21,7 +21,7 @@
 
   /// Cache for speeding up the computation of
   /// [_getGenericSupertypeDecorations].
-  final Map<InterfaceElement, Map<ClassElement, DecoratedType>>
+  final Map<InterfaceElement, Map<InterfaceElement, DecoratedType>>
       _genericSupertypeDecorations = {};
 
   DecoratedClassHierarchy(this._variables, this._graph);
@@ -30,10 +30,10 @@
   ///
   /// If the [type] is a [TypeParameterType], it will be resolved against its
   /// bound.
-  DecoratedType asInstanceOf(DecoratedType type, ClassElement? superclass) {
+  DecoratedType asInstanceOf(DecoratedType type, InterfaceElement? superclass) {
     type = _getInterfaceType(type);
     var typeType = type.type as InterfaceType;
-    var class_ = typeType.element;
+    var class_ = typeType.element2;
     if (class_ == superclass) return type;
     var result = getDecoratedSupertype(class_, superclass!);
     if (result.typeArguments.isNotEmpty && type.typeArguments.isNotEmpty) {
@@ -69,7 +69,7 @@
 
   /// Computes a map whose keys are all the superclasses of [class_], and whose
   /// values indicate how [class_] implements each superclass.
-  Map<ClassElement, DecoratedType> _getGenericSupertypeDecorations(
+  Map<InterfaceElement, DecoratedType> _getGenericSupertypeDecorations(
       InterfaceElement class_) {
     var decorations = _genericSupertypeDecorations[class_];
     if (decorations == null) {
@@ -86,7 +86,7 @@
         // this specific [superclass].
         Map<TypeParameterElement, DecoratedType?> substitution = {};
         for (int i = 0; i < supertype.typeArguments.length; i++) {
-          substitution[supertype.element.typeParameters[i]] =
+          substitution[supertype.element2.typeParameters[i]] =
               decoratedSupertype.typeArguments[i];
         }
         // Apply that substitution to the relation between [superclass] and
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 12b3f4d..38cad25 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -199,7 +199,7 @@
     var type = this.type;
     if (type is InterfaceType) {
       return Map<TypeParameterElement, DecoratedType?>.fromIterables(
-          type.element.typeParameters, typeArguments);
+          type.element2.typeParameters, typeArguments);
     } else {
       throw StateError(
           'Tried to convert a non-interface type to a substitution');
@@ -248,7 +248,7 @@
         }
         return true;
       } else if (thisType is InterfaceType && otherType is InterfaceType) {
-        if (thisType.element != otherType.element) return false;
+        if (thisType.element2 != otherType.element2) return false;
         if (!_compareLists(typeArguments, other.typeArguments)) {
           return false;
         }
@@ -339,7 +339,7 @@
     if (type is TypeParameterType || type is VoidType) {
       return '$type$trailing';
     } else if (type is InterfaceType) {
-      var name = type.element.name;
+      var name = type.element2.name;
       var args = '';
       if (type.typeArguments.isNotEmpty) {
         args = '<${typeArguments.join(', ')}>';
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 766c3fa..e4b64d7 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -703,7 +703,7 @@
     _dispatch(node.withClause);
     var classElement = node.declaredElement!;
     var supertype = classElement.supertype!;
-    var superElement = supertype.element;
+    var superElement = supertype.element2;
     for (var constructorElement in classElement.constructors) {
       assert(constructorElement.isSynthetic);
       var superConstructorElement =
@@ -2237,14 +2237,14 @@
           List<DecoratedType?> rightTypeArguments;
           if (isLUB) {
             leftTypeArguments = _decoratedClassHierarchy!
-                .asInstanceOf(left, type.element)
+                .asInstanceOf(left, type.element2)
                 .typeArguments;
             rightTypeArguments = _decoratedClassHierarchy!
-                .asInstanceOf(right, type.element)
+                .asInstanceOf(right, type.element2)
                 .typeArguments;
           } else {
-            if (leftType.element != type.element ||
-                rightType.element != type.element) {
+            if (leftType.element2 != type.element2 ||
+                rightType.element2 != type.element2) {
               _unimplemented(astNode, 'GLB with substitution');
             }
             leftTypeArguments = left.typeArguments;
@@ -2330,8 +2330,8 @@
         return DecoratedType(type, node);
       }
 
-      assert(leftType.element == type.element &&
-          rightType.element == type.element);
+      assert(leftType.sharedElement == type.element &&
+          rightType.sharedElement == type.element);
       return DecoratedType(type, node);
     }
     _unimplemented(astNode, '_decorateUpperOrLowerBound');
@@ -2904,8 +2904,7 @@
         if (_typeSystem.isSubtypeOf(
             iterableTypeType, typeProvider.iterableDynamicType)) {
           elementType = _decoratedClassHierarchy!
-              .asInstanceOf(
-                  iterableType, typeProvider.iterableDynamicType.element)
+              .asInstanceOf(iterableType, typeProvider.iterableElement)
               .typeArguments[0];
           _checkAssignment(
               ForEachVariableOrigin(source, parts), FixReasonTarget.root,
@@ -3537,7 +3536,7 @@
     }
 
     if (dartType is InterfaceType &&
-        dartType.element == typeProvider.futureOrElement) {
+        dartType.element2 == typeProvider.futureOrElement) {
       var typeArguments = type.typeArguments;
       if (typeArguments.length == 1) {
         // Wrapping FutureOr<T?1>?2 should produce Future<T?3>, where either 1
@@ -3552,7 +3551,7 @@
 
     if (_typeSystem.isSubtypeOf(dartType, typeProvider.futureDynamicType)) {
       return _decoratedClassHierarchy!
-          .asInstanceOf(type, typeProvider.futureDynamicType.element);
+          .asInstanceOf(type, typeProvider.futureElement);
     }
 
     return _futureOf(type, node!);
@@ -3769,7 +3768,7 @@
     } else if (sourceType is InterfaceType &&
         destinationType is InterfaceType) {
       var rewrittenSource = _decoratedClassHierarchy!
-          .asInstanceOf(source, destinationType.element);
+          .asInstanceOf(source, destinationType.element2);
       assert(rewrittenSource.typeArguments.length ==
           destination.typeArguments.length);
       for (int i = 0; i < rewrittenSource.typeArguments.length; i++) {
@@ -3827,16 +3826,17 @@
       required DecoratedType destination,
       required bool hard}) {
     var destinationType = destination.type!;
-    assert(_typeSystem.isSubtypeOf(destinationType, source.type!));
+    final sourceType = source.type!;
+    assert(_typeSystem.isSubtypeOf(destinationType, sourceType));
     // Nullability should narrow to maintain subtype relationship.
     _connect(source.node, destination.node, origin, FixReasonTarget.root,
         hard: hard);
 
-    if (source.type!.isDynamic ||
-        source.type!.isDartCoreObject ||
-        source.type!.isVoid) {
+    if (sourceType.isDynamic ||
+        sourceType.isDartCoreObject ||
+        sourceType.isVoid) {
       if (destinationType is InterfaceType) {
-        for (final param in destinationType.element.typeParameters) {
+        for (final param in destinationType.element2.typeParameters) {
           assert(param.bound == null,
               'downcast to type parameters with bounds not supported');
         }
@@ -3853,17 +3853,17 @@
       // trying to store a value into a `List<Null>`).  So do nothing.
       return;
     } else if (destinationType is TypeParameterType) {
-      if (source.type is! TypeParameterType) {
+      if (sourceType is! TypeParameterType) {
         // Assume an assignment to the type parameter's bound.
         _checkAssignment(origin, FixReasonTarget.root,
             source: source,
             destination: _getTypeParameterTypeBound(destination)!,
             hard: false);
-      } else if (destinationType == source.type) {
+      } else if (destinationType == sourceType) {
         // Nothing to do.
         return;
       }
-    } else if (source.type!.isDartAsyncFutureOr) {
+    } else if (sourceType.isDartAsyncFutureOr) {
       if (destination.type!.isDartAsyncFuture) {
         // FutureOr<T?> is nullable, so the Future<T> should be nullable too.
         _connect(source.typeArguments[0]!.node, destination.node, origin,
@@ -3885,9 +3885,9 @@
             hard: false);
       }
     } else if (destinationType is InterfaceType) {
-      if (source.type is InterfaceType) {
+      if (sourceType is InterfaceType) {
         final target = _decoratedClassHierarchy!
-            .asInstanceOf(destination, source.type!.element as ClassElement?);
+            .asInstanceOf(destination, sourceType.element2);
         for (var i = 0; i < source.typeArguments.length; ++i) {
           _checkDowncast(origin,
               source: source.typeArguments[i]!,
@@ -3896,18 +3896,18 @@
         }
       } else {
         assert(false,
-            'downcasting from ${source.type.runtimeType} to interface type');
+            'downcasting from ${sourceType.runtimeType} to interface type');
       }
     } else if (destinationType is FunctionType) {
-      if (source.type!.isDartCoreFunction) {
+      if (sourceType.isDartCoreFunction) {
         // Nothing else to do.
         return;
       }
     } else {
       assert(
           false,
-          'downcasting from ${source.type.runtimeType} to '
-          '${destinationType.runtimeType} not supported. (${source.type} $destinationType)');
+          'downcasting from ${sourceType.runtimeType} to '
+          '${destinationType.runtimeType} not supported. ($sourceType $destinationType)');
     }
   }
 
@@ -3983,4 +3983,15 @@
     }
     return self;
   }
+
+  Element? get sharedElement {
+    final self = this;
+    if (self is InterfaceType) {
+      return self.element2;
+    } else if (self is TypeParameterType) {
+      return self.element;
+    } else {
+      return null;
+    }
+  }
 }
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 03b5fd2..781b3ff 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -134,7 +134,7 @@
     String suffix =
         type.nullabilitySuffix == NullabilitySuffix.question ? '?' : '';
     if (type is InterfaceType) {
-      var name = elementToCode(type.element);
+      var name = elementToCode(type.element2);
       var typeArguments = type.typeArguments;
       if (typeArguments.isEmpty) {
         return '$name$suffix';
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index eff55d1..2241e87 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -356,7 +356,7 @@
         () => element.interfacesInternal,
         () => [
               for (var interface in element.interfacesInternal)
-                _getClassInterface(element, interface.element)
+                _getClassInterface(element, interface.element2)
             ]);
   }
 
@@ -678,7 +678,7 @@
   }
 
   InterfaceType _getClassInterface(
-      ClassElement class_, ClassElement superclass) {
+      ClassElement class_, InterfaceElement superclass) {
     var decoratedSupertype = _fixBuilder!._decoratedClassHierarchy!
         .getDecoratedSupertype(class_, superclass);
     var finalType = _fixBuilder!._variables!.toFinalType(decoratedSupertype);
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index a41a5ed..c381411 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -533,7 +533,7 @@
     List<DecoratedType?> positionalParameters = const <DecoratedType>[];
     Map<String, DecoratedType?> namedParameters =
         const <String, DecoratedType>{};
-    if (type is InterfaceType && type.element.typeParameters.isNotEmpty) {
+    if (type is InterfaceType && type.element2.typeParameters.isNotEmpty) {
       if (node is NamedType) {
         if (node.typeArguments == null) {
           int index = 0;
@@ -918,7 +918,7 @@
     if (onClause != null) {
       supertypes.addAll(onClause.superclassConstraints);
     }
-    var decoratedSupertypes = <ClassElement, DecoratedType?>{};
+    var decoratedSupertypes = <InterfaceElement, DecoratedType?>{};
     _pushNullabilityNodeTarget(
         NullabilityNodeTarget.element(declaredElement).supertype, () {
       for (var supertype in supertypes) {
@@ -933,7 +933,7 @@
         } else {
           decoratedSupertype = supertype.accept(this);
         }
-        var class_ = (decoratedSupertype!.type as InterfaceType).element;
+        var class_ = (decoratedSupertype!.type as InterfaceType).element2;
         decoratedSupertypes[class_] = decoratedSupertype;
       }
     });
diff --git a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
index 3971a35..2361147 100644
--- a/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/resolution_utils.dart
@@ -32,7 +32,7 @@
 
   List<String> _computeObjectGetNames() {
     var result = <String>[];
-    var objectClass = typeProvider.objectType.element;
+    var objectClass = typeProvider.objectType.element2;
     for (var accessor in objectClass.accessors) {
       assert(accessor.isGetter);
       assert(!accessor.name.startsWith('_'));
diff --git a/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart b/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
index e2bc4fd..35d3588 100644
--- a/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/where_not_null_transformer.dart
@@ -69,7 +69,7 @@
     var type = decoratedType.type;
     var typeArguments = decoratedType.typeArguments;
     if (type is InterfaceType &&
-        type.element == _typeProvider.iterableElement &&
+        type.element2 == _typeProvider.iterableElement &&
         typeArguments.length == 1) {
       return DecoratedType(type, decoratedType.node,
           typeArguments: [typeArguments.single?.withNode(graph.never)]);
@@ -86,11 +86,11 @@
   /// checks or type casts in other parts of the code.
   DartType transformPostMigrationInvocationType(DartType type) {
     if (type is InterfaceType &&
-        type.element == _typeProvider.iterableElement) {
+        type.element2 == _typeProvider.iterableElement) {
       var typeArguments = type.typeArguments;
       if (typeArguments.length == 1) {
         return InterfaceTypeImpl(
-            element: type.element,
+            element2: type.element2,
             typeArguments: [_typeSystem.promoteToNonNull(typeArguments.single)],
             nullabilitySuffix: type.nullabilitySuffix);
       }
diff --git a/pkg/nnbd_migration/lib/src/variables.dart b/pkg/nnbd_migration/lib/src/variables.dart
index 1ff963c..ce1a368 100644
--- a/pkg/nnbd_migration/lib/src/variables.dart
+++ b/pkg/nnbd_migration/lib/src/variables.dart
@@ -49,7 +49,7 @@
   final _decoratedElementTypes = <Element?, DecoratedType?>{};
 
   final _decoratedDirectSupertypes =
-      <InterfaceElement, Map<ClassElement, DecoratedType?>>{};
+      <InterfaceElement, Map<InterfaceElement, DecoratedType?>>{};
 
   final _decoratedTypeAnnotations = <Source?, Map<int, DecoratedType>>{};
 
@@ -75,7 +75,7 @@
 
   /// Given a [class_], gets the decorated type information for the superclasses
   /// it directly implements/extends/etc.
-  Map<ClassElement, DecoratedType?> decoratedDirectSupertypes(
+  Map<InterfaceElement, DecoratedType?> decoratedDirectSupertypes(
       InterfaceElement class_) {
     return _decoratedDirectSupertypes[class_] ??=
         _decorateDirectSupertypes(class_);
@@ -206,7 +206,7 @@
   /// Associates a [class_] with decorated type information for the superclasses
   /// it directly implements/extends/etc.
   void recordDecoratedDirectSupertypes(ClassElement class_,
-      Map<ClassElement, DecoratedType?> decoratedDirectSupertypes) {
+      Map<InterfaceElement, DecoratedType?> decoratedDirectSupertypes) {
     _decoratedDirectSupertypes[class_] = decoratedDirectSupertypes;
   }
 
@@ -341,7 +341,7 @@
       );
     } else if (type is InterfaceType) {
       return InterfaceTypeImpl(
-        element: type.element,
+        element2: type.element2,
         typeArguments: [
           for (var arg in decoratedType.typeArguments) toFinalType(arg!)
         ],
@@ -417,12 +417,12 @@
 
   /// Creates an entry [_decoratedDirectSupertypes] for an already-migrated
   /// class.
-  Map<ClassElement, DecoratedType> _decorateDirectSupertypes(
+  Map<InterfaceElement, DecoratedType> _decorateDirectSupertypes(
       InterfaceElement class_) {
-    var result = <ClassElement, DecoratedType>{};
+    var result = <InterfaceElement, DecoratedType>{};
     for (var decoratedSupertype
         in _alreadyMigratedCodeDecorator.getImmediateSupertypes(class_)) {
-      var class_ = (decoratedSupertype.type as InterfaceType).element;
+      var class_ = (decoratedSupertype.type as InterfaceType).element2;
       result[class_] = decoratedSupertype;
     }
     return result;
diff --git a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
index 57d6285..3a9a00a 100644
--- a/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
+++ b/pkg/nnbd_migration/test/already_migrated_code_decorator_test.dart
@@ -244,7 +244,7 @@
     var withElement = await _ContextWithFiles().withEmptyUnit();
 
     var decoratedType = withElement.decorate(InterfaceTypeImpl(
-        element: withElement.typeProvider.mapElement,
+        element2: withElement.typeProvider.mapElement,
         typeArguments: [
           withElement.typeProvider.intType,
           withElement.typeProvider.numType
@@ -262,7 +262,7 @@
     withElement.checkInt(
         withElement.decorate(
           InterfaceTypeImpl(
-            element: withElement.typeProvider.intElement,
+            element2: withElement.typeProvider.intElement,
             typeArguments: const [],
             nullabilitySuffix: NullabilitySuffix.question,
           ),
@@ -277,7 +277,7 @@
     withElement.checkInt(
         withElement.decorate(
           InterfaceTypeImpl(
-            element: withElement.typeProvider.intElement,
+            element2: withElement.typeProvider.intElement,
             typeArguments: const [],
             nullabilitySuffix: suffix,
           ),
@@ -535,7 +535,8 @@
     void Function(DecoratedType?, String) checkArgument,
     String displayName,
   ) {
-    expect(decoratedType.type!.element, typeProvider.futureOrElement);
+    final type = decoratedType.type as InterfaceType;
+    expect(type.element2, typeProvider.futureOrElement);
     checkNullability(decoratedType.node, displayName);
     checkArgument(
         decoratedType.typeArguments[0], 'type argument 0 of $displayName');
@@ -546,7 +547,8 @@
     void Function(NullabilityNode?, String) checkNullability,
     String displayName,
   ) {
-    expect(decoratedType.type!.element, typeProvider.intType.element);
+    final type = decoratedType.type as InterfaceType;
+    expect(type.element2, typeProvider.intElement);
     checkNullability(decoratedType.node, displayName);
   }
 
@@ -556,8 +558,8 @@
     void Function(DecoratedType?, String) checkArgument,
     String displayName,
   ) {
-    expect(
-        decoratedType.type!.element, typeProvider.iterableDynamicType.element);
+    final type = decoratedType.type as InterfaceType;
+    expect(type.element2, typeProvider.iterableElement);
     checkNullability(decoratedType.node, displayName);
     checkArgument(
         decoratedType.typeArguments[0], 'type argument 0 of $displayName');
@@ -573,7 +575,8 @@
     void Function(NullabilityNode?, String) checkNullability,
     String displayName,
   ) {
-    expect(decoratedType.type!.element, typeProvider.numType.element);
+    final type = decoratedType.type as InterfaceType;
+    expect(type.element2, typeProvider.numElement);
     checkNullability(decoratedType.node, displayName);
   }
 
@@ -582,7 +585,8 @@
     void Function(NullabilityNode?, String) checkNullability,
     String displayName,
   ) {
-    expect(decoratedType.type!.element, typeProvider.objectType.element);
+    final type = decoratedType.type as InterfaceType;
+    expect(type.element2, typeProvider.objectType.element2);
     checkNullability(decoratedType.node, displayName);
   }
 
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 2ba066f..c3055c1 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -103,7 +103,7 @@
     }
     return DecoratedType(
       InterfaceTypeImpl(
-        element: _myListOfListClass!,
+        element2: _myListOfListClass!,
         typeArguments: [elementType.type!],
         nullabilitySuffix: NullabilitySuffix.star,
       ),
@@ -593,7 +593,7 @@
     await analyze('''
 double f() => double.nan;
 ''');
-    var nanElement = typeProvider.doubleType.element.getField('nan')!;
+    var nanElement = typeProvider.doubleElement.getField('nan')!;
     assertEdge(variables!.decoratedElementType(nanElement).node,
         decoratedTypeAnnotation('double f').node,
         hard: false);
@@ -5049,7 +5049,7 @@
 ''');
     var toStringReturnType = variables!
         .decoratedElementType(
-            typeProvider.objectType.element.getMethod('toString')!)
+            typeProvider.objectType.element2.getMethod('toString')!)
         .returnType!;
     assertEdge(
         toStringReturnType.node, decoratedTypeAnnotation('String f').node,
@@ -6939,7 +6939,7 @@
     await analyze('int f(void Function() g) => g.hashCode;');
     var hashCodeReturnType = variables!
         .decoratedElementType(
-            typeProvider.objectType.element.getGetter('hashCode')!)
+            typeProvider.objectType.element2.getGetter('hashCode')!)
         .returnType!;
     assertEdge(hashCodeReturnType.node, decoratedTypeAnnotation('int f').node,
         hard: false);
@@ -8254,8 +8254,8 @@
   late AssignmentCheckerTest assignmentCheckerTest;
 
   @override
-  DecoratedType asInstanceOf(DecoratedType type, ClassElement? superclass) {
-    var class_ = (type.type as InterfaceType).element;
+  DecoratedType asInstanceOf(DecoratedType type, InterfaceElement? superclass) {
+    var class_ = (type.type as InterfaceType).element2;
     if (class_ == superclass) return type;
     if (superclass!.name == 'Object') {
       return DecoratedType(
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index c60d2f8..87335b1 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -380,7 +380,7 @@
   DecoratedType decoratedConstructorDeclaration(String search) => variables!
       .decoratedElementType(findNode.constructor(search).declaredElement!);
 
-  Map<ClassElement, DecoratedType?> decoratedDirectSupertypes(String name) {
+  Map<InterfaceElement, DecoratedType?> decoratedDirectSupertypes(String name) {
     return variables!.decoratedDirectSupertypes(findElement.classOrMixin(name));
   }
 
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index 737bb72..9c1b9d3 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -312,7 +312,7 @@
 class C<T, U> {}
 ''');
     var types = decoratedDirectSupertypes('C');
-    var decorated = types[typeProvider.objectType.element]!;
+    var decorated = types[typeProvider.objectType.element2]!;
     _assertType(decorated.type!, 'Object');
     assertEdge(decorated.node, never, hard: true, checkable: false);
     expect(decorated.typeArguments, isEmpty);
@@ -418,7 +418,7 @@
 mixin C<T, U> {}
 ''');
     var types = decoratedDirectSupertypes('C');
-    var decorated = types[typeProvider.objectType.element]!;
+    var decorated = types[typeProvider.objectType.element2]!;
     _assertType(decorated.type!, 'Object');
     assertEdge(decorated.node, never, hard: true, checkable: false);
     expect(decorated.typeArguments, isEmpty);
diff --git a/tools/VERSION b/tools/VERSION
index d3923b3..458ff10 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 65
+PRERELEASE 66
 PRERELEASE_PATCH 0
\ No newline at end of file