Elements. Use more TypeImpl, and less casts.

Change-Id: I98e3818380cb58d04aa5017a3047bb156ab4c9b3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/412500
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 882156a..7659b1e 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5686,7 +5686,7 @@
   final EnumConstantArgumentsImpl? arguments;
 
   @override
-  ConstructorElement? constructorElement;
+  ConstructorElementMixin? constructorElement;
 
   /// Initializes a newly created enum constant declaration.
   ///
@@ -5704,10 +5704,10 @@
 
   @experimental
   @override
-  ConstructorElement2? get constructorElement2 =>
+  ConstructorElementMixin2? get constructorElement2 =>
       constructorElement?.asElement2;
 
-  set constructorElement2(ConstructorElement2? value) {
+  set constructorElement2(ConstructorElementMixin2? value) {
     constructorElement = value?.asElement;
   }
 
@@ -10860,10 +10860,10 @@
   TypeArgumentListImpl? _typeArguments;
 
   @override
-  List<DartType>? typeArgumentTypes;
+  List<TypeImpl>? typeArgumentTypes;
 
   @override
-  DartType? staticInvokeType;
+  TypeImpl? staticInvokeType;
 
   /// Initializes a newly created invocation.
   InvocationExpressionImpl({
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index aea2c42..dfd4c7d 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -130,7 +130,7 @@
   }
 
   @override
-  void visitConstantPattern(ConstantPattern node) {
+  void visitConstantPattern(covariant ConstantPatternImpl node) {
     var expression = node.expression.unParenthesized;
     if (expression.typeOrThrow is InvalidType) {
       return;
@@ -517,7 +517,7 @@
   /// Returns `false` if we can prove that `constant == value` always returns
   /// `false`, taking into account the fact that [constantType] has primitive
   /// equality.
-  bool _canBeEqual(DartType constantType, DartType valueType) {
+  bool _canBeEqual(TypeImpl constantType, TypeImpl valueType) {
     if (constantType is InterfaceType) {
       if (valueType is InterfaceTypeImpl) {
         if (constantType.isDartCoreInt && valueType.isDartCoreDouble) {
@@ -776,7 +776,7 @@
 
   /// Check if the object [obj] matches the type [type] according to runtime
   /// type checking rules.
-  bool _runtimeTypeMatch(DartObjectImpl obj, DartType type) {
+  bool _runtimeTypeMatch(DartObjectImpl obj, TypeImpl type) {
     return _currentLibrary.typeSystem.runtimeTypeMatch(obj, type);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index e1016ce..056ea78 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -2910,7 +2910,8 @@
         if (baseParameter.isInitializingFormal) {
           var field = (parameter as FieldFormalParameterElement).field;
           if (field != null) {
-            var fieldType = field.type;
+            // TODO(scheglov): eliminate this cast
+            var fieldType = field.type as TypeImpl;
             if (fieldType != parameter.type) {
               // We've already checked that the argument can be assigned to the
               // parameter; we also need to check that it can be assigned to
@@ -3192,7 +3193,7 @@
   /// type-checking rules.
   bool runtimeTypeMatch(
     DartObjectImpl obj,
-    DartType type,
+    TypeImpl type,
   ) {
     type = type.extensionTypeErasure;
     var objType = obj.type;
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 38472e9..36d1372 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1808,6 +1808,9 @@
   ConstructorElementImpl2 get baseElement;
 
   @override
+  InterfaceElementImpl2 get enclosingElement2;
+
+  @override
   InterfaceTypeImpl get returnType;
 }
 
@@ -1974,10 +1977,9 @@
       return null;
     }
 
+    // TODO(scheglov): eliminate this cast
+    superDefault as DartObjectImpl;
     var superDefaultType = superDefault.type;
-    if (superDefaultType == null) {
-      return null;
-    }
 
     var typeSystem = library?.typeSystem;
     if (typeSystem == null) {
@@ -3745,12 +3747,12 @@
   }
 
   @override
-  List<FieldElement> get constants {
+  List<FieldElementOrMember> get constants {
     return fields.where((field) => field.isEnumConstant).toList();
   }
 
   @override
-  List<FieldElement2> get constants2 =>
+  List<FieldElement2OrMember> get constants2 =>
       constants.map((e) => e.asElement2).toList();
 
   @override
@@ -4328,7 +4330,7 @@
   ConstructorElement2 get primaryConstructor2 => primaryConstructor.element;
 
   @override
-  FieldElement2 get representation2 => representation.asElement2;
+  FieldElement2OrMember get representation2 => representation.asElement2;
 
   @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
@@ -4489,7 +4491,7 @@
   }
 
   @override
-  GetterElement? get getter2 => firstFragment.getter?.element as GetterElement?;
+  GetterElementImpl? get getter2 => firstFragment.getter?.element;
 
   @override
   bool get hasImplicitType => firstFragment.hasImplicitType;
@@ -4533,7 +4535,7 @@
   String? get name3 => firstFragment.name2;
 
   @override
-  SetterElement? get setter2 => firstFragment.setter?.element as SetterElement?;
+  SetterElementImpl? get setter2 => firstFragment.setter?.element;
 
   @override
   TypeImpl get type => firstFragment.type;
@@ -4611,8 +4613,9 @@
   FieldFormalParameterElementImpl2(super.firstFragment);
 
   @override
-  FieldElement2? get field2 => switch (firstFragment) {
-        FieldFormalParameterElementImpl(:FieldFragment field) => field.element,
+  FieldElementImpl2? get field2 => switch (firstFragment) {
+        FieldFormalParameterElementImpl(:FieldElementImpl field) =>
+          field.element,
         _ => null,
       };
 
@@ -5940,11 +5943,11 @@
   InstanceElementImpl get firstFragment;
 
   @override
-  List<GetterElement> get getters2 {
+  List<GetterElement2OrMember> get getters2 {
     _readMembers();
     return accessors
         .where((e) => e.isGetter)
-        .map((e) => e.asElement2 as GetterElement?)
+        .map((e) => e.asElement2 as GetterElement2OrMember)
         .nonNulls
         .toList();
   }
@@ -6484,7 +6487,7 @@
   }
 
   @override
-  PropertyAccessorElement? getSetter(String setterName) {
+  PropertyAccessorElementOrMember? getSetter(String setterName) {
     return getSetterFromAccessors(setterName, accessors);
   }
 
@@ -6708,8 +6711,8 @@
     }
   }
 
-  static PropertyAccessorElement? getSetterFromAccessors(
-      String setterName, List<PropertyAccessorElement> accessors) {
+  static PropertyAccessorElementOrMember? getSetterFromAccessors(
+      String setterName, List<PropertyAccessorElementOrMember> accessors) {
     // Do we need the check for isSetter below?
     if (!setterName.endsWith('=')) {
       setterName += '=';
@@ -7443,12 +7446,12 @@
   }
 
   @override
-  List<GetterElement> get getters {
-    var declarations = <GetterElement>{};
+  List<GetterElement2OrMember> get getters {
+    var declarations = <GetterElement2OrMember>{};
     for (var unit in units) {
       declarations.addAll(unit._accessors
           .where((accessor) => accessor.isGetter)
-          .map((accessor) => (accessor as GetterFragment).element));
+          .map((accessor) => accessor.element as GetterElement2OrMember));
     }
     return declarations.toList();
   }
@@ -10441,7 +10444,13 @@
 /// Common base class for all analyzer-internal classes that implement
 /// [PropertyInducingElement2].
 abstract class PropertyInducingElement2OrMember
-    implements VariableElement2OrMember, PropertyInducingElement2 {}
+    implements VariableElement2OrMember, PropertyInducingElement2 {
+  @override
+  GetterElement2OrMember? get getter2;
+
+  @override
+  SetterElement2OrMember? get setter2;
+}
 
 /// A concrete implementation of a [PropertyInducingElement].
 abstract class PropertyInducingElementImpl
@@ -10936,7 +10945,7 @@
   }
 
   @override
-  FormalParameterElement? get superConstructorParameter2 {
+  FormalParameterElementMixin? get superConstructorParameter2 {
     return firstFragment.superConstructorParameter?.asElement2;
   }
 
@@ -11097,7 +11106,8 @@
   }
 
   @override
-  GetterElement? get getter2 => firstFragment.getter2?.element;
+  GetterElementImpl? get getter2 =>
+      firstFragment.getter2?.element as GetterElementImpl?;
 
   @override
   bool get hasImplicitType => firstFragment.hasImplicitType;
@@ -11129,7 +11139,8 @@
   String? get name3 => firstFragment.name2;
 
   @override
-  SetterElement? get setter2 => firstFragment.setter2?.element;
+  SetterElementImpl? get setter2 =>
+      firstFragment.setter2?.element as SetterElementImpl?;
 
   @override
   TypeImpl get type => firstFragment.type;
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index d277536..93dd7ee 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -399,7 +399,7 @@
   void _checkArgumentsNotMatchingBounds({
     required SyntacticEntity? errorEntity,
     required ErrorReporter? errorReporter,
-    required List<DartType> typeArguments,
+    required List<TypeImpl> typeArguments,
   }) {
     for (int i = 0; i < _typeFormals.length; i++) {
       var parameter = _typeFormals[i];
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
index 7a0a97b..01d4535 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -83,16 +83,14 @@
   /// not `null`, add a new [Conflict] to it.
   ExecutableElementOrMember? combineSignatures({
     required InterfaceElement targetClass,
-    required List<ExecutableElement> candidates,
+    required List<ExecutableElementOrMember> candidates,
     required bool doTopMerge,
     required Name name,
     List<Conflict>? conflicts,
   }) {
     // If just one candidate, it is always valid.
     if (candidates.length == 1) {
-      // TODO(paulberry): eliminate this cast by changing the type of the
-      // parameter `candidates`.
-      return candidates[0] as ExecutableElementOrMember;
+      return candidates[0];
     }
 
     var targetLibrary = targetClass.library as LibraryElementImpl;
@@ -100,10 +98,7 @@
 
     var validOverrides = <ExecutableElementOrMember>[];
     for (var i = 0; i < candidates.length; i++) {
-      // TODO(paulberry): eliminate this cast by changing the type of the
-      // parameter `candidates`.
-      ExecutableElementOrMember? validOverride =
-          candidates[i] as ExecutableElementOrMember;
+      ExecutableElementOrMember? validOverride = candidates[i];
       var validOverrideType = validOverride.type;
       for (var j = 0; j < candidates.length; j++) {
         var candidate = candidates[j];
@@ -136,7 +131,7 @@
   }
 
   /// Return the result of [getInherited2] with [type] substitution.
-  ExecutableElement? getInherited(InterfaceType type, Name name) {
+  ExecutableElementOrMember? getInherited(InterfaceType type, Name name) {
     var rawElement = getInherited2(type.element, name);
     if (rawElement == null) {
       return null;
@@ -228,7 +223,7 @@
       _findMostSpecificFromNamedCandidates(
         element,
         inheritedMap,
-        element is ExtensionTypeElement
+        element is ExtensionTypeElementImpl
             ? interface.redeclared
             : interface.overridden,
         doTopMerge: false,
@@ -417,7 +412,8 @@
   /// Return all members of mixins, superclasses, and interfaces that a member
   /// with the given [name], defined in the [element], would override; or `null`
   /// if no members would be overridden.
-  List<ExecutableElementOrMember>? getOverridden2(InterfaceElement element, Name name) {
+  List<ExecutableElementOrMember>? getOverridden2(
+      InterfaceElement element, Name name) {
     var interface = getInterface(element);
     return interface.overridden[name];
   }
@@ -535,7 +531,7 @@
   List<Conflict> _findMostSpecificFromNamedCandidates(
     InterfaceElement targetClass,
     Map<Name, ExecutableElement> map,
-    Map<Name, List<ExecutableElement>> namedCandidates, {
+    Map<Name, List<ExecutableElementOrMember>> namedCandidates, {
     required bool doTopMerge,
   }) {
     var conflicts = <Conflict>[];
@@ -623,7 +619,8 @@
       //     }
       // So, each mixin always replaces members in the interface.
       // And there are individual override conflicts for each mixin.
-      var candidatesFromSuperAndMixin = <Name, List<ExecutableElement>>{};
+      var candidatesFromSuperAndMixin =
+          <Name, List<ExecutableElementOrMember>>{};
       var mixinConflicts = <Conflict>[];
       for (var entry in mixinInterface.map.entries) {
         var name = entry.key;
@@ -807,7 +804,7 @@
       }
     }
 
-    var redeclared = <Name, List<ExecutableElement>>{};
+    var redeclared = <Name, List<ExecutableElementOrMember>>{};
     var conflicts = <Conflict>[];
 
     // Add extension type members.
@@ -915,7 +912,7 @@
     }
 
     // Ensure unique overridden elements.
-    var uniqueRedeclared = <Name, List<ExecutableElement>>{};
+    var uniqueRedeclared = <Name, List<ExecutableElementOrMember>>{};
     for (var entry in redeclared.entries) {
       var name = entry.key;
       var elements = entry.value;
@@ -1267,7 +1264,7 @@
 
   /// The map of names to the signatures from superinterfaces that a member
   /// declaration in this extension type redeclares.
-  final Map<Name, List<ExecutableElement>> redeclared;
+  final Map<Name, List<ExecutableElementOrMember>> redeclared;
 
   /// The map of names to the signatures from superinterfaces that a member
   /// declaration in this extension type redeclares.
@@ -1308,7 +1305,7 @@
 
   /// The map of names to their signature in the interface.
   @experimental
-  Map<Name, ExecutableElement2> get map2 {
+  Map<Name, ExecutableElement2OrMember> get map2 {
     return map.mapValue((element) => element.asElement2);
   }
 
@@ -1420,7 +1417,7 @@
 
   _ExtensionTypeCandidates(this.name);
 
-  List<ExecutableElement> get all {
+  List<ExecutableElementOrMember> get all {
     return [...methods, ...getters, ...setters];
   }
 
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index 8b3f83f..395605a 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -55,7 +55,7 @@
   String get displayName => declaration.displayName;
 
   @override
-  InterfaceElement2 get enclosingElement2 => _element2.enclosingElement2;
+  InterfaceElementImpl2 get enclosingElement2 => _element2.enclosingElement2;
 
   @override
   InterfaceElement get enclosingElement3 => declaration.enclosingElement3;
@@ -507,7 +507,7 @@
   ) : super._();
 
   @override
-  FieldElement? get field {
+  FieldElementOrMember? get field {
     var field = (declaration as FieldFormalParameterElement).field;
     if (field == null) {
       return null;
@@ -597,7 +597,7 @@
   }
 
   @override
-  GetterElement? get getter2 {
+  GetterElement2OrMember? get getter2 {
     var baseGetter = declaration.getter;
     if (baseGetter == null) {
       return null;
@@ -656,7 +656,7 @@
   }
 
   @override
-  SetterElement? get setter2 {
+  SetterElement2OrMember? get setter2 {
     var baseSetter = declaration.setter;
     if (baseSetter == null) {
       return null;
@@ -709,7 +709,8 @@
   /// from the [definingType], create a field member representing the given
   /// field. Return the member that was created, or the base field if no member
   /// was created.
-  static FieldElement from(FieldElement field, InterfaceType definingType) {
+  static FieldElementOrMember from(
+      FieldElementOrMember field, InterfaceType definingType) {
     if (definingType.typeArguments.isEmpty) {
       return field;
     }
@@ -1511,8 +1512,8 @@
   /// arguments from the [definingType], create an accessor member representing
   /// the given accessor. Return the member that was created, or the base
   /// accessor if no member was created.
-  static PropertyAccessorElement? from(
-      PropertyAccessorElement? accessor, InterfaceType definingType) {
+  static PropertyAccessorElementOrMember? from(
+      PropertyAccessorElementOrMember? accessor, InterfaceType definingType) {
     if (accessor == null || definingType.typeArguments.isEmpty) {
       return accessor;
     }
diff --git a/pkg/analyzer/lib/src/dart/element/subtype.dart b/pkg/analyzer/lib/src/dart/element/subtype.dart
index ff61e6b..388702f 100644
--- a/pkg/analyzer/lib/src/dart/element/subtype.dart
+++ b/pkg/analyzer/lib/src/dart/element/subtype.dart
@@ -6,7 +6,6 @@
     show Variance;
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
@@ -31,28 +30,25 @@
         _objectNone = _typeSystem.objectNone,
         _objectQuestion = _typeSystem.objectQuestion;
 
-  /// Return `true` if [T0_] is a subtype of [T1_].
-  bool isSubtypeOf(DartType T0_, DartType T1_) {
+  /// Return `true` if [T0] is a subtype of [T1].
+  bool isSubtypeOf(TypeImpl T0, TypeImpl T1) {
     // Reflexivity: if `T0` and `T1` are the same type then `T0 <: T1`.
-    if (identical(T0_, T1_)) {
+    if (identical(T0, T1)) {
       return true;
     }
 
     // `_` is treated as a top and a bottom type during inference.
-    if (identical(T0_, UnknownInferredType.instance) ||
-        identical(T1_, UnknownInferredType.instance)) {
+    if (identical(T0, UnknownInferredType.instance) ||
+        identical(T1, UnknownInferredType.instance)) {
       return true;
     }
 
     // `InvalidType` is treated as a top and a bottom type.
-    if (identical(T0_, InvalidTypeImpl.instance) ||
-        identical(T1_, InvalidTypeImpl.instance)) {
+    if (identical(T0, InvalidTypeImpl.instance) ||
+        identical(T1, InvalidTypeImpl.instance)) {
       return true;
     }
 
-    var T0 = T0_ as TypeImpl;
-    var T1 = T1_ as TypeImpl;
-
     var T1_nullability = T1.nullabilitySuffix;
     var T0_nullability = T0.nullabilitySuffix;
 
@@ -115,7 +111,7 @@
       // Extension types require explicit `Object` implementation.
       if (T0 is InterfaceTypeImpl && T0.element3 is ExtensionTypeElement2) {
         for (var interface in T0.interfaces) {
-          if (isSubtypeOf(interface, T1_)) {
+          if (isSubtypeOf(interface, T1)) {
             return true;
           }
         }
@@ -303,19 +299,19 @@
   }
 
   bool _interfaceArguments(
-    InterfaceElement2 element,
-    InterfaceType subType,
-    InterfaceType superType,
+    InterfaceElementImpl2 element,
+    InterfaceTypeImpl subType,
+    InterfaceTypeImpl superType,
   ) {
-    List<TypeParameterElement2> parameters = element.typeParameters2;
-    List<DartType> subArguments = subType.typeArguments;
-    List<DartType> superArguments = superType.typeArguments;
+    var parameters = element.typeParameters2;
+    var subArguments = subType.typeArguments;
+    var superArguments = superType.typeArguments;
 
     assert(subArguments.length == superArguments.length);
     assert(parameters.length == subArguments.length);
 
-    for (int i = 0; i < subArguments.length; i++) {
-      var parameter = parameters[i] as TypeParameterElementImpl2;
+    for (var i = 0; i < subArguments.length; i++) {
+      var parameter = parameters[i];
       var subArgument = subArguments[i];
       var superArgument = superArguments[i];
 
@@ -344,7 +340,7 @@
   }
 
   /// Check that [f] is a subtype of [g].
-  bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionType g) {
+  bool _isFunctionSubtypeOf(FunctionTypeImpl f, FunctionTypeImpl g) {
     var fresh =
         _typeSystem.relateTypeParameters2(f.typeParameters, g.typeParameters);
     if (fresh == null) {
@@ -440,7 +436,10 @@
     return true;
   }
 
-  bool _isInterfaceSubtypeOf(InterfaceType subType, InterfaceType superType) {
+  bool _isInterfaceSubtypeOf(
+    InterfaceTypeImpl subType,
+    InterfaceTypeImpl superType,
+  ) {
     // Note: we should never reach `_isInterfaceSubtypeOf` with `i2 == Object`,
     // because top types are eliminated before `isSubtypeOf` calls this.
     // TODO(scheglov): Replace with assert().
@@ -468,7 +467,7 @@
       if (identical(interface.element3, superElement)) {
         var substitution = Substitution.fromInterfaceType(subType);
         var substitutedInterface =
-            substitution.substituteType(interface) as InterfaceType;
+            substitution.substituteType(interface) as InterfaceTypeImpl;
         return _interfaceArguments(
           superElement,
           substitutedInterface,
@@ -481,7 +480,7 @@
   }
 
   /// Check that [subType] is a subtype of [superType].
-  bool _isRecordSubtypeOf(RecordType subType, RecordType superType) {
+  bool _isRecordSubtypeOf(RecordTypeImpl subType, RecordTypeImpl superType) {
     var subPositional = subType.positionalFields;
     var superPositional = superType.positionalFields;
     if (subPositional.length != superPositional.length) {
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index a531e33..881069a 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -217,11 +217,11 @@
       };
 
   @override
-  List<DartType> get normalParameterTypes =>
+  List<TypeImpl> get normalParameterTypes =>
       positionalParameterTypes.sublist(0, requiredPositionalParameterCount);
 
   @override
-  List<DartType> get optionalParameterTypes =>
+  List<TypeImpl> get optionalParameterTypes =>
       positionalParameterTypes.sublist(requiredPositionalParameterCount);
 
   @override
@@ -645,7 +645,7 @@
   @override
   List<PropertyAccessorElement> get accessors {
     if (_accessors == null) {
-      List<PropertyAccessorElement> accessors = element.accessors;
+      var accessors = element.accessors;
       var members = <PropertyAccessorElement>[];
       for (int i = 0; i < accessors.length; i++) {
         members.add(PropertyAccessorMember.from(accessors[i], this)!);
@@ -937,7 +937,7 @@
   }
 
   @override
-  PropertyAccessorElement? getGetter(String getterName) =>
+  PropertyAccessorElementOrMember? getGetter(String getterName) =>
       PropertyAccessorMember.from(element.getGetter(getterName), this);
 
   @override
@@ -999,7 +999,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is PropertyAccessorElement) {
+        if (result is PropertyAccessorElementOrMember) {
           return result;
         }
       }
@@ -1036,7 +1036,7 @@
   }
 
   @override
-  MethodElement? lookUpMethod2(
+  MethodElementOrMember? lookUpMethod2(
     String name,
     LibraryElement library, {
     bool concrete = false,
@@ -1054,7 +1054,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is MethodElement) {
+        if (result is MethodElementOrMember) {
           return result;
         }
       }
@@ -1074,7 +1074,7 @@
   }
 
   @override
-  MethodElement2? lookUpMethod3(
+  MethodElement2OrMember? lookUpMethod3(
     String name,
     LibraryElement2 library, {
     bool concrete = false,
@@ -1109,7 +1109,7 @@
         }
       } else {
         var result = inheritance.getInherited(this, nameObj);
-        if (result is PropertyAccessorElement) {
+        if (result is PropertyAccessorElementOrMember) {
           return result;
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/element/type_system.dart b/pkg/analyzer/lib/src/dart/element/type_system.dart
index ab9201b..a3784d7 100644
--- a/pkg/analyzer/lib/src/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_system.dart
@@ -520,8 +520,8 @@
   ///
   /// This does not find extension methods (which are not defined on an
   /// interface type); it is meant to find implicit call references.
-  FunctionType? getCallMethodType(DartType t) {
-    if (t is InterfaceType) {
+  FunctionTypeImpl? getCallMethodType(DartType t) {
+    if (t is InterfaceTypeImpl) {
       return t
           .lookUpMethod3(MethodElement2.CALL_METHOD_NAME, t.element3.library2)
           ?.type;
@@ -859,8 +859,11 @@
   }
 
   @override
-  bool isAssignableTo(DartType fromType, DartType toType,
-      {bool strictCasts = false}) {
+  bool isAssignableTo(
+    covariant TypeImpl fromType,
+    covariant TypeImpl toType, {
+    bool strictCasts = false,
+  }) {
     // An actual subtype
     if (isSubtypeOf(fromType, toType)) {
       return true;
@@ -872,7 +875,7 @@
     }
 
     // A 'call' method tearoff.
-    if (fromType is InterfaceType &&
+    if (fromType is InterfaceTypeImpl &&
         !isNullable(fromType) &&
         acceptsFunctionType(toType)) {
       var callMethodType = getCallMethodType(fromType);
@@ -920,7 +923,7 @@
   /// Implements:
   /// https://github.com/dart-lang/language
   /// See `resources/type-system/subtyping.md#type-equality`
-  bool isEqualTo(DartType left, DartType right) {
+  bool isEqualTo(TypeImpl left, TypeImpl right) {
     return isSubtypeOf(left, right) && isSubtypeOf(right, left);
   }
 
@@ -1281,7 +1284,10 @@
   /// https://github.com/dart-lang/language
   /// See `resources/type-system/subtyping.md`
   @override
-  bool isSubtypeOf(DartType leftType, DartType rightType) {
+  bool isSubtypeOf(
+    covariant TypeImpl leftType,
+    covariant TypeImpl rightType,
+  ) {
     return _subtypeHelper.isSubtypeOf(leftType, rightType);
   }
 
@@ -1498,9 +1504,9 @@
   /// left operand has the type [leftType] and whose right operand has the type
   /// [rightType], given that resolution has so far produced the [currentType].
   TypeImpl refineBinaryExpressionType(
-      DartType leftType,
+      TypeImpl leftType,
       TokenType operator,
-      DartType rightType,
+      TypeImpl rightType,
       TypeImpl currentType,
       MethodElement2? operatorElement) {
     if (operatorElement == null) return currentType;
@@ -1514,9 +1520,9 @@
   /// [invocationContext], and the context type produced so far by resolution is
   /// [currentType].
   TypeImpl refineNumericInvocationContext2(
-      DartType? targetType,
+      TypeImpl? targetType,
       Element2? methodElement,
-      DartType invocationContext,
+      TypeImpl invocationContext,
       TypeImpl currentType) {
     if (targetType != null && methodElement is MethodElement2) {
       return _refineNumericInvocationContextNullSafe(
@@ -1534,9 +1540,9 @@
   ///
   // TODO(scheglov): I expected that [methodElement] is [MethodElement].
   TypeImpl refineNumericInvocationType(
-      DartType targetType,
+      TypeImpl targetType,
       Element2? methodElement,
-      List<DartType> argumentTypes,
+      List<TypeImpl> argumentTypes,
       TypeImpl currentType) {
     if (methodElement is MethodElement2) {
       return _refineNumericInvocationTypeNullSafe(
@@ -1554,7 +1560,7 @@
   /// be used to instantiate both function types, allowing further comparison.
   RelatedTypeParameters2? relateTypeParameters2(
     List<TypeParameterElementImpl2> typeParameters1,
-    List<TypeParameterElement2> typeParameters2,
+    List<TypeParameterElementImpl2> typeParameters2,
   ) {
     if (typeParameters1.length != typeParameters2.length) {
       return null;
@@ -1824,9 +1830,9 @@
   }
 
   TypeImpl _refineNumericInvocationContextNullSafe(
-      DartType targetType,
+      TypeImpl targetType,
       MethodElement2 methodElement,
-      DartType invocationContext,
+      TypeImpl invocationContext,
       TypeImpl currentType) {
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
@@ -1926,9 +1932,9 @@
   }
 
   TypeImpl _refineNumericInvocationTypeNullSafe(
-      DartType targetType,
+      TypeImpl targetType,
       MethodElement2 methodElement,
-      List<DartType> argumentTypes,
+      List<TypeImpl> argumentTypes,
       TypeImpl currentType) {
     // If the method being invoked comes from an extension, don't refine the
     // type because we can only make guarantees about methods defined in the
diff --git a/pkg/analyzer/lib/src/dart/element/well_bounded.dart b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
index 5acc140..6324e93 100644
--- a/pkg/analyzer/lib/src/dart/element/well_bounded.dart
+++ b/pkg/analyzer/lib/src/dart/element/well_bounded.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -73,18 +74,18 @@
     return _isSuperBounded(type);
   }
 
-  TypeBoundedResult _isRegularBounded(DartType type) {
+  TypeBoundedResult _isRegularBounded(TypeImpl type) {
     List<TypeArgumentIssue>? issues;
 
     String? elementName;
-    List<TypeParameterElement2> typeParameters;
-    List<DartType> typeArguments;
+    List<TypeParameterElementImpl2> typeParameters;
+    List<TypeImpl> typeArguments;
     var alias = type.alias;
     if (alias != null) {
       elementName = alias.element2.name3;
       typeParameters = alias.element2.typeParameters2;
       typeArguments = alias.typeArguments;
-    } else if (type is InterfaceType) {
+    } else if (type is InterfaceTypeImpl) {
       elementName = type.element3.name3;
       typeParameters = type.element3.typeParameters2;
       typeArguments = type.typeArguments;
diff --git a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
index 7fef4bf..ae364e2 100644
--- a/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/applicable_extensions.dart
@@ -18,7 +18,7 @@
 class InstantiatedExtensionWithMember {
   final _NotInstantiatedExtensionWithMember candidate;
   final MapSubstitution substitution;
-  final DartType extendedType;
+  final TypeImpl extendedType;
 
   InstantiatedExtensionWithMember(
     this.candidate,
@@ -71,7 +71,7 @@
 
   R instantiate({
     required MapSubstitution substitution,
-    required DartType extendedType,
+    required TypeImpl extendedType,
   });
 }
 
@@ -87,7 +87,7 @@
   @override
   InstantiatedExtensionWithMember instantiate({
     required MapSubstitution substitution,
-    required DartType extendedType,
+    required TypeImpl extendedType,
   }) {
     return InstantiatedExtensionWithMember(this, substitution, extendedType);
   }
diff --git a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
index 513792d..a656434 100644
--- a/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/assignment_expression_resolver.dart
@@ -116,9 +116,9 @@
   }
 
   void _checkForInvalidAssignment(
-    DartType writeType,
+    TypeImpl writeType,
     Expression right,
-    DartType rightType, {
+    TypeImpl rightType, {
     required Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted,
   }) {
     if (writeType is! VoidType && _checkForUseOfVoidResult(right)) {
@@ -131,10 +131,10 @@
       return;
     }
 
-    if (writeType is RecordType &&
+    if (writeType is RecordTypeImpl &&
         writeType.positionalFields.length == 1 &&
         rightType is! RecordType &&
-        right is ParenthesizedExpression) {
+        right is ParenthesizedExpressionImpl) {
       var field = writeType.positionalFields.first;
       if (_typeSystem.isAssignableTo(field.type, rightType,
           strictCasts: strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
index 25aa44a..e88b9f0 100644
--- a/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/binary_expression_resolver.dart
@@ -280,7 +280,7 @@
 
   void _resolveRightOperand(
     BinaryExpressionImpl node,
-    DartType contextType,
+    TypeImpl contextType,
   ) {
     var left = node.leftOperand;
 
@@ -317,7 +317,7 @@
   }
 
   void _resolveUserDefinable(BinaryExpressionImpl node,
-      {required DartType contextType}) {
+      {required TypeImpl contextType}) {
     var left = node.leftOperand;
 
     if (left is AugmentedExpressionImpl) {
@@ -354,7 +354,7 @@
   void _resolveUserDefinableAugmented(
     BinaryExpressionImpl node, {
     required AugmentedExpressionImpl left,
-    required DartType contextType,
+    required TypeImpl contextType,
   }) {
     var methodName = node.operator.lexeme;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
index fa2bcf0..a1c78f6 100644
--- a/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/body_inference_context.dart
@@ -17,7 +17,7 @@
 
   /// The imposed return type, from the typing context.
   /// Might be `null` if an empty typing context.
-  final DartType? imposedType;
+  final TypeImpl? imposedType;
 
   /// The context type, computed from [imposedType].
   /// Might be `null` if an empty typing context.
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 8742ef4..8a00bab 100644
--- a/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/constructor_reference_resolver.dart
@@ -5,6 +5,7 @@
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -31,7 +32,8 @@
     var element = node.constructorName.element;
     if (element != null && !element.isFactory) {
       var enclosingElement = element.enclosingElement2;
-      if (enclosingElement is ClassElement2 && enclosingElement.isAbstract) {
+      if (enclosingElement is ClassElementImpl2 &&
+          enclosingElement.isAbstract) {
         _resolver.errorReporter.atNode(
           node,
           CompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
index eca3161..d9112eb 100644
--- a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -260,7 +260,7 @@
   void _checkTypeArgumentsMatchingBounds(
     List<TypeParameterElementImpl2> typeParameters,
     TypeArgumentList? typeArgumentList,
-    List<DartType> typeArgumentTypes,
+    List<TypeImpl> typeArgumentTypes,
     Substitution substitution,
   ) {
     if (typeArgumentList != null) {
@@ -333,7 +333,7 @@
   /// If the number of explicit type arguments is different than the number
   /// of extension's type parameters, or inference fails, returns `dynamic`
   /// for all type parameters.
-  List<DartType>? _inferTypeArguments(
+  List<TypeImpl>? _inferTypeArguments(
       ExtensionOverrideImpl node, TypeImpl receiverType,
       {required TypeConstraintGenerationDataForTesting? dataForTesting,
       required AstNodeImpl? nodeForTesting}) {
@@ -345,7 +345,7 @@
       var arguments = typeArguments.arguments;
       if (arguments.length == typeParameters.length) {
         if (typeParameters.isEmpty) {
-          return const <DartType>[];
+          return const <TypeImpl>[];
         }
         return arguments.map((a) => a.typeOrThrow).toList();
       } else {
@@ -385,7 +385,7 @@
 
   /// Instantiate the extended type of the [extension] to the bounds of the
   /// type formals of the extension.
-  DartType _instantiateToBounds(ExtensionElement2 extension) {
+  TypeImpl _instantiateToBounds(ExtensionElement2 extension) {
     extension as ExtensionElementImpl2;
     var typeParameters = extension.typeParameters2;
     return Substitution.fromPairs2(
@@ -436,11 +436,11 @@
   }
 
   /// Ask the type system for a subtype check.
-  bool _isSubtypeOf(DartType type1, DartType type2) =>
+  bool _isSubtypeOf(TypeImpl type1, TypeImpl type2) =>
       _typeSystem.isSubtypeOf(type1, type2);
 
-  List<DartType> _listOfDynamic(List<Object?> parameters) {
-    return List<DartType>.filled(parameters.length, DynamicTypeImpl.instance);
+  List<TypeImpl> _listOfDynamic(List<Object?> parameters) {
+    return List<TypeImpl>.filled(parameters.length, DynamicTypeImpl.instance);
   }
 
   static bool _isCascadeTarget(ExtensionOverride node) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
index 841e859..03ff427 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_expression_invocation_resolver.dart
@@ -193,7 +193,7 @@
     _resolve(node, rawType, whyNotPromotedArguments, contextType: contextType);
   }
 
-  void _unresolved(FunctionExpressionInvocationImpl node, DartType type,
+  void _unresolved(FunctionExpressionInvocationImpl node, TypeImpl type,
       List<WhyNotPromotedGetter> whyNotPromotedArguments,
       {required TypeImpl contextType}) {
     _setExplicitTypeArgumentTypes(node);
@@ -218,7 +218,7 @@
           .map((typeArgument) => typeArgument.typeOrThrow)
           .toList();
     } else {
-      node.typeArgumentTypes = const <DartType>[];
+      node.typeArgumentTypes = const <TypeImpl>[];
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
index abee317..44592796 100644
--- a/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/invocation_inferrer.dart
@@ -159,7 +159,7 @@
     var typeArgumentList = _typeArguments;
     var originalType = rawType;
 
-    List<DartType>? typeArgumentTypes;
+    List<TypeImpl>? typeArgumentTypes;
     GenericInferrer? inferrer;
     Substitution? substitution;
     if (_isGenericInferenceDisabled) {
@@ -171,7 +171,7 @@
         substitution =
             Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes);
       } else {
-        typeArgumentTypes = const <DartType>[];
+        typeArgumentTypes = const <TypeImpl>[];
       }
     } else if (typeArgumentList != null) {
       if (rawType != null &&
@@ -216,7 +216,7 @@
             Substitution.fromPairs(rawType.typeFormals, typeArgumentTypes);
       }
     } else if (rawType == null || rawType.typeFormals.isEmpty) {
-      typeArgumentTypes = const <DartType>[];
+      typeArgumentTypes = const <TypeImpl>[];
     } else {
       var typeParameters = [for (var tp in rawType.typeFormals) tp.element];
       rawType =
@@ -331,7 +331,7 @@
   }
 
   List<FormalParameterElement>? _storeResult(
-      List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
+      List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
     return invokeType?.formalParameters;
   }
 }
@@ -424,7 +424,7 @@
 
   @override
   List<FormalParameterElement>? _storeResult(
-      List<DartType>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
+      List<TypeImpl>? typeArgumentTypes, FunctionTypeImpl? invokeType) {
     node.typeArgumentTypes = typeArgumentTypes;
     node.staticInvokeType = invokeType ?? DynamicTypeImpl.instance;
     return super._storeResult(typeArgumentTypes, invokeType);
diff --git a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
index 6c6f492..693df05 100644
--- a/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/postfix_expression_resolver.dart
@@ -77,7 +77,7 @@
   ///
   // TODO(scheglov): this is duplicate
   void _checkForInvalidAssignmentIncDec(
-      PostfixExpression node, Expression operand, DartType type) {
+      PostfixExpressionImpl node, Expression operand, TypeImpl type) {
     var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo(type, operandWriteType,
         strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
index 5d6be72..937cc3c 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefix_expression_resolver.dart
@@ -99,7 +99,7 @@
   ///
   // TODO(scheglov): this is duplicate
   void _checkForInvalidAssignmentIncDec(
-      PrefixExpressionImpl node, DartType type) {
+      PrefixExpressionImpl node, TypeImpl type) {
     var operandWriteType = node.writeType!;
     if (!_typeSystem.isAssignableTo(type, operandWriteType,
         strictCasts: _resolver.analysisOptions.strictCasts)) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 0c2bccf..fa1bfb4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/scope.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/type_provider.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
@@ -1825,7 +1824,7 @@
   void _verifyExtensionElementImplements(
     ExtensionTypeElementImpl declaredElement,
     NamedTypeImpl node,
-    DartType type,
+    TypeImpl type,
   ) {
     var typeSystem = _libraryElement.typeSystem;
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
index 6e29942..16a1fc7 100644
--- a/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/yield_statement_resolver.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -78,7 +77,7 @@
     var expression = node.expression;
     var expressionType = expression.typeOrThrow;
 
-    DartType impliedReturnType;
+    TypeImpl impliedReturnType;
     if (isYieldEach) {
       impliedReturnType = expressionType;
     } else if (bodyContext.isSynchronous) {
@@ -124,7 +123,7 @@
       // Since the declared return type might have been "dynamic", we need to
       // also check that the implied return type is assignable to generic
       // Iterable/Stream.
-      DartType requiredReturnType;
+      TypeImpl requiredReturnType;
       if (bodyContext.isSynchronous) {
         requiredReturnType = _typeProvider.iterableDynamicType;
       } else {
diff --git a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
index 7d26f0f..4052ed8 100644
--- a/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
+++ b/pkg/analyzer/lib/src/error/bool_expression_verifier.dart
@@ -5,7 +5,6 @@
 import 'package:_fe_analyzer_shared/src/flow_analysis/flow_analysis.dart';
 import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
@@ -20,7 +19,7 @@
   final ErrorReporter _errorReporter;
   final NullableDereferenceVerifier _nullableDereferenceVerifier;
 
-  final InterfaceType _boolType;
+  final InterfaceTypeImpl _boolType;
 
   BoolExpressionVerifier({
     required ResolverVisitor resolver,
diff --git a/pkg/analyzer/lib/src/error/correct_override.dart b/pkg/analyzer/lib/src/error/correct_override.dart
index fd76e89..c366c9b 100644
--- a/pkg/analyzer/lib/src/error/correct_override.dart
+++ b/pkg/analyzer/lib/src/error/correct_override.dart
@@ -21,7 +21,7 @@
   final TypeSystemImpl _typeSystem;
 
   final ExecutableElement2OrMember _thisMember;
-  FunctionType? _thisTypeForSubtype;
+  FunctionTypeImpl? _thisTypeForSubtype;
 
   final DiagnosticFactory _diagnosticFactory = DiagnosticFactory();
 
@@ -35,7 +35,7 @@
 
   /// Return `true` if [_thisMember] is a correct override of [superMember].
   bool isCorrectOverrideOf({
-    required ExecutableElement2 superMember,
+    required ExecutableElement2OrMember superMember,
   }) {
     var superType = superMember.type;
     return _typeSystem.isSubtypeOf(_thisTypeForSubtype!, superType);
@@ -44,7 +44,7 @@
   /// If [_thisMember] is not a correct override of [superMember], report the
   /// error.
   void verify({
-    required ExecutableElement2 superMember,
+    required ExecutableElement2OrMember superMember,
     required ErrorReporter errorReporter,
     required SyntacticEntity errorNode,
     required ErrorCode errorCode,
@@ -100,10 +100,10 @@
   final AnalysisSessionImpl _session;
   final TypeSystemImpl _typeSystem;
 
-  final ExecutableElement2 _thisMember;
+  final ExecutableElement2OrMember _thisMember;
 
   CovariantParametersVerifier({
-    required ExecutableElement2 thisMember,
+    required ExecutableElement2OrMember thisMember,
   })  : _session = thisMember.library2.session as AnalysisSessionImpl,
         _typeSystem = thisMember.library2.typeSystem as TypeSystemImpl,
         _thisMember = thisMember;
@@ -159,8 +159,8 @@
     return superMembers;
   }
 
-  Map<FormalParameterElement, List<_SuperParameter>> _superParameters() {
-    var result = <FormalParameterElement, List<_SuperParameter>>{};
+  Map<FormalParameterElementMixin, List<_SuperParameter>> _superParameters() {
+    var result = <FormalParameterElementMixin, List<_SuperParameter>>{};
 
     List<_SuperMember>? superMembers;
     var parameters = _thisMember.formalParameters;
@@ -267,7 +267,7 @@
 
 class _SuperParameter {
   final FormalParameterElement element;
-  final DartType type;
+  final TypeImpl type;
 
   _SuperParameter(this.element, this.type);
 
diff --git a/pkg/analyzer/lib/src/error/dead_code_verifier.dart b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
index c87361a..f976e01 100644
--- a/pkg/analyzer/lib/src/error/dead_code_verifier.dart
+++ b/pkg/analyzer/lib/src/error/dead_code_verifier.dart
@@ -6,12 +6,12 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/source/source_range.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
@@ -378,7 +378,7 @@
     }
   }
 
-  void verifyCatchClause(CatchClause node) {
+  void verifyCatchClause(CatchClauseImpl node) {
     var verifier = _catchClausesVerifiers.last;
     if (verifier._done) return;
 
@@ -506,7 +506,7 @@
   final List<CatchClause> catchClauses;
 
   bool _done = false;
-  final List<DartType> _visitedTypes = <DartType>[];
+  final List<TypeImpl> _visitedTypes = [];
 
   _CatchClausesVerifier(
     this._typeSystem,
@@ -514,7 +514,7 @@
     this.catchClauses,
   );
 
-  void nextCatchClause(CatchClause catchClause) {
+  void nextCatchClause(CatchClauseImpl catchClause) {
     var currentType = catchClause.exceptionType?.type;
 
     // Found catch clause that doesn't have an exception type.
diff --git a/pkg/analyzer/lib/src/error/error_handler_verifier.dart b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
index d9b3cb3..f138efb 100644
--- a/pkg/analyzer/lib/src/error/error_handler_verifier.dart
+++ b/pkg/analyzer/lib/src/error/error_handler_verifier.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -94,7 +95,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         // TODO(srawlins): Also check return type of the 'onError' named
         // argument to [Future<T>.then].
         _checkErrorHandlerFunctionType(
@@ -117,7 +118,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback is FunctionExpression);
@@ -139,7 +140,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback.expression is FunctionExpression);
@@ -160,7 +161,7 @@
       if (callbackType == null) {
         return;
       }
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkErrorHandlerFunctionType(
             callback, callbackType, _typeProvider.voidType,
             checkFirstParameterType: callback is FunctionExpression);
@@ -178,7 +179,7 @@
   /// Certain error handlers are allowed to specify a different type for their
   /// first parameter.
   void _checkErrorHandlerFunctionType(Expression expression,
-      FunctionType expressionType, DartType expectedFunctionReturnType,
+      FunctionTypeImpl expressionType, DartType expectedFunctionReturnType,
       {bool checkFirstParameterType = true}) {
     void report() {
       _errorReporter.atNode(
@@ -223,7 +224,7 @@
     var expectedReturnType = _typeProvider.futureOrType(targetFutureType);
     if (callback is FunctionExpressionImpl) {
       // TODO(migration): should be FunctionType, not nullable
-      var callbackType = callback.staticType as FunctionType;
+      var callbackType = callback.staticType as FunctionTypeImpl;
       _checkErrorHandlerFunctionType(
           callback, callbackType, expectedReturnType);
       var catchErrorOnErrorExecutable = EnclosingExecutableContext(
@@ -237,7 +238,7 @@
       callback.body.accept(returnStatementVerifier);
     } else {
       var callbackType = callback.staticType;
-      if (callbackType is FunctionType) {
+      if (callbackType is FunctionTypeImpl) {
         _checkReturnType(expectedReturnType, callbackType.returnType, callback);
         _checkErrorHandlerFunctionType(
             callback, callbackType, expectedReturnType);
@@ -249,7 +250,7 @@
   }
 
   void _checkReturnType(
-      DartType expectedType, DartType functionReturnType, Expression callback) {
+      TypeImpl expectedType, TypeImpl functionReturnType, Expression callback) {
     if (!_typeSystem.isAssignableTo(functionReturnType, expectedType,
         strictCasts: _strictCasts)) {
       _errorReporter.atNode(
diff --git a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
index 79fff63..398e21e 100644
--- a/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
+++ b/pkg/analyzer/lib/src/error/getter_setter_types_verifier.dart
@@ -3,9 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/element2.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
 import 'package:analyzer/src/error/codes.dart';
 
@@ -22,18 +23,19 @@
   })  : _typeSystem = typeSystem,
         _errorReporter = errorReporter;
 
-  void checkExtension(ExtensionElement2 element) {
+  void checkExtension(ExtensionElementImpl2 element) {
     for (var getter in element.getters2) {
       _checkLocalGetter(getter);
     }
   }
 
-  void checkExtensionType(ExtensionTypeElement2 element, Interface interface) {
+  void checkExtensionType(
+      ExtensionTypeElementImpl2 element, Interface interface) {
     checkInterface(element, interface);
     checkStaticGetters(element.getters2);
   }
 
-  void checkInterface(InterfaceElement2 element, Interface interface) {
+  void checkInterface(InterfaceElementImpl2 element, Interface interface) {
     var libraryUri = element.library2.uri;
 
     var interfaceMap = interface.map2;
@@ -50,7 +52,7 @@
           if (!_typeSystem.isSubtypeOf(getterType, setterType)) {
             Element2 errorElement;
             if (getter.enclosingElement2 == element) {
-              if (element is ExtensionTypeElement2 &&
+              if (element is ExtensionTypeElementImpl2 &&
                   element.representation2.getter2 == getter) {
                 errorElement = setter;
               } else {
@@ -85,7 +87,7 @@
     }
   }
 
-  void checkStaticGetters(List<GetterElement> getters) {
+  void checkStaticGetters(List<GetterElement2OrMember> getters) {
     for (var getter in getters) {
       if (getter.isStatic) {
         _checkLocalGetter(getter);
@@ -93,7 +95,7 @@
     }
   }
 
-  void _checkLocalGetter(GetterElement getter) {
+  void _checkLocalGetter(GetterElement2OrMember getter) {
     var name = getter.name3;
     if (name == null) {
       return;
@@ -120,12 +122,12 @@
   }
 
   /// Return the return type of the [getter].
-  static DartType _getGetterType(GetterElement getter) {
+  static TypeImpl _getGetterType(GetterElement2OrMember getter) {
     return getter.returnType;
   }
 
   /// Return the type of the first parameter of the [setter].
-  static DartType? _getSetterType(SetterElement setter) {
+  static TypeImpl? _getSetterType(SetterElement2OrMember setter) {
     var parameters = setter.formalParameters;
     if (parameters.isNotEmpty) {
       return parameters[0].type;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index c151e6f..8f72ae4 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -297,7 +297,7 @@
     GetterSetterTypesVerifier(
       typeSystem: typeSystem,
       errorReporter: reporter,
-    ).checkInterface(fragment.asElement2, interface);
+    ).checkInterface((fragment as InterfaceElementImpl).asElement2, interface);
 
     if (declaration is ClassElement && !declaration.isAbstract ||
         declaration is EnumElement) {
diff --git a/pkg/analyzer/lib/src/error/literal_element_verifier.dart b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
index 59aeddb..b96037a 100644
--- a/pkg/analyzer/lib/src/error/literal_element_verifier.dart
+++ b/pkg/analyzer/lib/src/error/literal_element_verifier.dart
@@ -51,7 +51,7 @@
 
   /// Check that the given [type] is assignable to the [elementType], otherwise
   /// report the list or set error on the [errorNode].
-  void _checkAssignableToElementType(DartType type, AstNode errorNode) {
+  void _checkAssignableToElementType(TypeImpl type, AstNode errorNode) {
     var elementType = this.elementType;
 
     if (!typeSystem.isAssignableTo(type, elementType!,
diff --git a/pkg/analyzer/lib/src/error/return_type_verifier.dart b/pkg/analyzer/lib/src/error/return_type_verifier.dart
index aae43ae..1a06e47 100644
--- a/pkg/analyzer/lib/src/error/return_type_verifier.dart
+++ b/pkg/analyzer/lib/src/error/return_type_verifier.dart
@@ -3,12 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/nullability_suffix.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_provider.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -82,7 +82,7 @@
       return;
     }
 
-    void checkElement(ClassElement2 expectedElement, ErrorCode errorCode) {
+    void checkElement(ClassElementImpl2 expectedElement, ErrorCode errorCode) {
       void reportError() {
         enclosingExecutable.hasLegalReturnType = false;
         _errorReporter.atNode(
@@ -291,8 +291,8 @@
     );
   }
 
-  bool _isLegalReturnType(ClassElement2 expectedElement) {
-    DartType returnType = enclosingExecutable.returnType;
+  bool _isLegalReturnType(ClassElementImpl2 expectedElement) {
+    var returnType = enclosingExecutable.returnType;
     //
     // When checking an async/sync*/async* method, we know the exact type
     // that will be returned (e.g. Future, Iterable, or Stream).
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 32dff3f..8d6ff67 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/extensions.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/dart/element/type_system.dart';
@@ -34,12 +35,12 @@
   TypeSystemImpl get _typeSystem =>
       _libraryElement.typeSystem as TypeSystemImpl;
 
-  void checkConstructorReference(ConstructorReference node) {
+  void checkConstructorReference(ConstructorReferenceImpl node) {
     var classElement = node.constructorName.type.element2;
-    List<TypeParameterElement2> typeParameters;
-    if (classElement is TypeAliasElement2) {
+    List<TypeParameterElementImpl2> typeParameters;
+    if (classElement is TypeAliasElementImpl2) {
       typeParameters = classElement.typeParameters2;
-    } else if (classElement is InterfaceElement2) {
+    } else if (classElement is InterfaceElementImpl2) {
       typeParameters = classElement.typeParameters2;
     } else {
       return;
@@ -99,7 +100,7 @@
     }
   }
 
-  void checkEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void checkEnumConstantDeclaration(EnumConstantDeclarationImpl node) {
     var constructorElement = node.constructorElement2;
     if (constructorElement == null) {
       return;
@@ -293,9 +294,9 @@
       return;
     }
 
-    List<TypeParameterElement2> typeParameters;
+    List<TypeParameterElementImpl2> typeParameters;
     String? elementName;
-    List<DartType> typeArguments;
+    List<TypeImpl> typeArguments;
     var alias = type.alias;
     if (alias != null) {
       elementName = alias.element2.name3;
@@ -329,7 +330,7 @@
 
       var typeArgument = typeArguments[i];
 
-      if (typeArgument is FunctionType &&
+      if (typeArgument is FunctionTypeImpl &&
           typeArgument.typeParameters.isNotEmpty) {
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.atNode(
@@ -421,7 +422,7 @@
 
     // Prepare type arguments for checking for super-bounded.
     var invertedType = _typeSystem.replaceTopAndBottom(type);
-    List<DartType> invertedTypeArguments;
+    List<TypeImpl> invertedTypeArguments;
     var invertedAlias = invertedType.alias;
     if (invertedAlias != null) {
       invertedTypeArguments = invertedAlias.typeArguments;
@@ -499,9 +500,9 @@
       //     <TFrom, TTo extends Iterable<TFrom>>
       //     <T extends Cloneable<T>>
       //
-      DartType argType = typeArgs[i];
+      var argType = typeArgs[i];
 
-      if (argType is FunctionType && argType.typeParameters.isNotEmpty) {
+      if (argType is FunctionTypeImpl && argType.typeParameters.isNotEmpty) {
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.atNode(
             typeArgumentList[i],
diff --git a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
index 935a8c0..bba1e30 100644
--- a/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
+++ b/pkg/analyzer/lib/src/generated/error_detection_helpers.dart
@@ -41,8 +41,8 @@
   /// argument.
   void checkForArgumentTypeNotAssignable(
       Expression expression,
-      DartType expectedStaticType,
-      DartType actualStaticType,
+      TypeImpl expectedStaticType,
+      TypeImpl actualStaticType,
       ErrorCode errorCode,
       {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) {
     if (expectedStaticType is! VoidType &&
@@ -73,8 +73,8 @@
 
   void checkForAssignableExpressionAtType(
       Expression expression,
-      DartType actualStaticType,
-      DartType expectedStaticType,
+      TypeImpl actualStaticType,
+      TypeImpl expectedStaticType,
       ErrorCode errorCode,
       {Map<SharedTypeView, NonPromotionReason> Function()? whyNotPromoted}) {
     if (expectedStaticType is! VoidType &&
@@ -94,7 +94,7 @@
         return node;
       }
 
-      if (expectedStaticType is RecordType &&
+      if (expectedStaticType is RecordTypeImpl &&
           expectedStaticType.positionalFields.length == 1 &&
           actualStaticType is! RecordType &&
           expression is ParenthesizedExpression) {
@@ -111,8 +111,8 @@
       }
       if (errorCode == CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE) {
         var additionalInfo = <String>[];
-        if (expectedStaticType is RecordType &&
-            actualStaticType is RecordType) {
+        if (expectedStaticType is RecordTypeImpl &&
+            actualStaticType is RecordTypeImpl) {
           var actualPositionalFields = actualStaticType.positionalFields.length;
           var expectedPositionalFields =
               expectedStaticType.positionalFields.length;
@@ -169,16 +169,17 @@
   /// See [CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE], and
   /// [CompileTimeErrorCode.FIELD_INITIALIZER_NOT_ASSIGNABLE].
   void checkForFieldInitializerNotAssignable(
-      ConstructorFieldInitializer initializer, FieldElement2 fieldElement,
+      ConstructorFieldInitializerImpl initializer,
+      FieldElement2OrMember fieldElement,
       {required bool isConstConstructor,
       required Map<SharedTypeView, NonPromotionReason> Function()?
           whyNotPromoted}) {
     // prepare field type
-    DartType fieldType = fieldElement.type;
+    var fieldType = fieldElement.type;
     // prepare expression type
     Expression expression = initializer.expression;
     // test the static type of the expression
-    DartType staticType = expression.typeOrThrow;
+    var staticType = expression.typeOrThrow;
     if (typeSystem.isAssignableTo(staticType, fieldType,
         strictCasts: strictCasts)) {
       if (fieldType is! VoidType) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 9182bbd..8779e9e 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -168,7 +168,7 @@
   final CompilationUnitElementImpl _currentUnit;
 
   /// The type representing the type 'int'.
-  late final InterfaceType _intType;
+  late final InterfaceTypeImpl _intType;
 
   /// The options for verification.
   final AnalysisOptions options;
@@ -217,7 +217,7 @@
 
   /// The class containing the AST nodes being visited, or `null` if we are not
   /// in the scope of a class.
-  InterfaceElement2? _enclosingClass;
+  InterfaceElementImpl2? _enclosingClass;
 
   /// The element of the extension being visited, or `null` if we are not
   /// in the scope of an extension.
@@ -628,13 +628,13 @@
   }
 
   @override
-  void visitConstructorReference(ConstructorReference node) {
+  void visitConstructorReference(covariant ConstructorReferenceImpl node) {
     _typeArgumentsVerifier.checkConstructorReference(node);
     _checkForInvalidGenerativeConstructorReference(node.constructorName);
   }
 
   @override
-  void visitDefaultFormalParameter(DefaultFormalParameter node) {
+  void visitDefaultFormalParameter(covariant DefaultFormalParameterImpl node) {
     var defaultValue = node.defaultValue;
     if (defaultValue != null) {
       checkForAssignableExpressionAtType(
@@ -649,7 +649,8 @@
   }
 
   @override
-  void visitEnumConstantDeclaration(EnumConstantDeclaration node) {
+  void visitEnumConstantDeclaration(
+      covariant EnumConstantDeclarationImpl node) {
     var element = node.declaredElement as FieldElementImpl;
 
     _checkAugmentations(
@@ -1332,7 +1333,7 @@
   }
 
   @override
-  void visitPostfixExpression(PostfixExpression node) {
+  void visitPostfixExpression(covariant PostfixExpressionImpl node) {
     var operand = node.operand;
     if (node.operator.type == TokenType.BANG) {
       checkForUseOfVoidResult(node);
@@ -1356,9 +1357,9 @@
   }
 
   @override
-  void visitPrefixExpression(PrefixExpression node) {
-    TokenType operatorType = node.operator.type;
-    Expression operand = node.operand;
+  void visitPrefixExpression(covariant PrefixExpressionImpl node) {
+    var operatorType = node.operator.type;
+    var operand = node.operand;
     if (operatorType != TokenType.BANG) {
       if (operatorType.isIncrementOperator) {
         _checkForAssignmentToFinal(operand);
@@ -1705,7 +1706,7 @@
   void _checkAugmentationTypeParameters({
     required Token nameToken,
     required TypeParameterList? typeParameterList,
-    required List<TypeParameterElement> declarationTypeParameters,
+    required List<TypeParameterElementImpl> declarationTypeParameters,
   }) {
     if (declarationTypeParameters.isEmpty) {
       if (typeParameterList != null) {
@@ -1897,7 +1898,7 @@
       InterfaceElementImpl declarationElement,
       NamedCompilationUnitMember node,
       NamedType? superclass,
-      WithClause? withClause,
+      WithClauseImpl? withClause,
       ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
     // isn't an error code such as "Cannot extend double" already on the
@@ -1996,7 +1997,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR],
   /// [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
-  bool _checkForAllMixinErrorCodes(WithClause? withClause) {
+  bool _checkForAllMixinErrorCodes(WithClauseImpl? withClause) {
     if (withClause == null) {
       return false;
     }
@@ -2005,7 +2006,7 @@
     for (int mixinNameIndex = 0;
         mixinNameIndex < withClause.mixinTypes.length;
         mixinNameIndex++) {
-      NamedType mixinName = withClause.mixinTypes[mixinNameIndex];
+      var mixinName = withClause.mixinTypes[mixinNameIndex];
       DartType mixinType = mixinName.typeOrThrow;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
@@ -2048,7 +2049,7 @@
 
   /// Check for errors related to the redirected constructors.
   void _checkForAllRedirectConstructorErrorCodes(
-      ConstructorDeclaration declaration) {
+      ConstructorDeclarationImpl declaration) {
     // Prepare redirected constructor node
     var redirectedConstructor = declaration.redirectedConstructor;
     if (redirectedConstructor == null) {
@@ -2076,12 +2077,12 @@
       }
       return;
     }
-    FunctionType redirectedType = redirectedElement.type;
-    DartType redirectedReturnType = redirectedType.returnType;
+    var redirectedType = redirectedElement.type;
+    var redirectedReturnType = redirectedType.returnType;
 
     // Report specific problem when return type is incompatible
-    FunctionType constructorType = declaration.declaredFragment!.element.type;
-    DartType constructorReturnType = constructorType.returnType;
+    var constructorType = declaration.declaredFragment!.element.type;
+    var constructorReturnType = constructorType.returnType;
     if (!typeSystem.isAssignableTo(redirectedReturnType, constructorReturnType,
         strictCasts: strictCasts)) {
       errorReporter.atNode(
@@ -3162,8 +3163,8 @@
     }
 
     // The type of the loop variable.
-    DartType variableType;
-    if (variableElement is VariableElement2) {
+    TypeImpl variableType;
+    if (variableElement is VariableElementImpl2) {
       variableType = variableElement.type;
     } else {
       return false;
@@ -3192,7 +3193,7 @@
       return false;
     }
 
-    DartType? sequenceElementType;
+    TypeImpl? sequenceElementType;
     {
       var sequenceElement = awaitKeyword != null
           ? _typeProvider.streamElement
@@ -3935,7 +3936,7 @@
   /// the argument value is implicit.
   ///
   /// See [CompileTimeErrorCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
-  void _checkForIntNotAssignable(Expression argument) {
+  void _checkForIntNotAssignable(ExpressionImpl argument) {
     var parameterElement = argument.correspondingParameter;
     var parameterType = parameterElement?.type;
     if (parameterType != null) {
@@ -4178,7 +4179,7 @@
     }
   }
 
-  void _checkForMainFunction2(FunctionDeclaration functionDeclaration) {
+  void _checkForMainFunction2(FunctionDeclarationImpl functionDeclaration) {
     if (functionDeclaration.name.lexeme != 'main') {
       return;
     }
@@ -4429,8 +4430,8 @@
   /// the [mixinIndex] position in the mixins list are satisfied by the
   /// [_enclosingClass], or a previous mixin.
   bool _checkForMixinSuperclassConstraints(
-      int mixinIndex, NamedType mixinName) {
-    InterfaceType mixinType = mixinName.type as InterfaceType;
+      int mixinIndex, NamedTypeImpl mixinName) {
+    var mixinType = mixinName.type as InterfaceTypeImpl;
     for (var constraint in mixinType.superclassConstraints) {
       var superType = _enclosingClass!.supertype as InterfaceTypeImpl;
       superType = superType.withNullability(NullabilitySuffix.none);
@@ -5758,7 +5759,7 @@
       return;
     }
     var element = parameter.declaredFragment?.element;
-    if (element is FieldFormalParameterElement2) {
+    if (element is FieldFormalParameterElementImpl2) {
       var fieldElement = element.field2;
       if (fieldElement == null || fieldElement.isSynthetic) {
         errorReporter.atNode(
@@ -5768,9 +5769,9 @@
         );
       } else {
         var parameterElement = parameter.declaredFragment?.element;
-        if (parameterElement is FieldFormalParameterElement2) {
-          DartType declaredType = parameterElement.type;
-          DartType fieldType = fieldElement.type;
+        if (parameterElement is FieldFormalParameterElementImpl2) {
+          var declaredType = parameterElement.type;
+          var fieldType = fieldElement.type;
           if (fieldElement.isSynthetic) {
             errorReporter.atNode(
               parameter,
@@ -5900,9 +5901,7 @@
   void _checkForWrongTypeParameterVarianceInField(FieldDeclaration node) {
     if (_enclosingClass != null) {
       for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-        // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-        // variance is added to the interface.
-        if (!(typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
+        if (!typeParameter.isLegacyCovariant) {
           var fields = node.fields;
           var fieldElement = fields.variables.first.declaredElement!;
           var fieldName = fields.variables.first.name;
@@ -5930,9 +5929,7 @@
     }
 
     for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-      // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-      // variance is added to the interface.
-      if ((typeParameter as TypeParameterElementImpl).isLegacyCovariant) {
+      if (typeParameter.isLegacyCovariant) {
         continue;
       }
 
@@ -5980,12 +5977,8 @@
     void checkOne(DartType? superInterface) {
       if (superInterface != null) {
         for (var typeParameter in _enclosingClass!.asElement.typeParameters) {
-          // TODO(kallentu): : Clean up TypeParameterElementImpl casting once
-          // variance is added to the interface.
-          var typeParameterElementImpl =
-              typeParameter as TypeParameterElementImpl;
           var superVariance =
-              typeParameterElementImpl.computeVarianceInType(superInterface);
+              typeParameter.computeVarianceInType(superInterface);
           // Let `D` be a class or mixin declaration, let `S` be a direct
           // superinterface of `D`, and let `X` be a type parameter declared by
           // `D`.
@@ -5995,16 +5988,15 @@
           // contravariant or unrelated position.
           // If `X` is an `inout` type parameter, it can occur in `S` in any
           // position.
-          if (!superVariance
-              .greaterThanOrEqual(typeParameterElementImpl.variance)) {
-            if (!typeParameterElementImpl.isLegacyCovariant) {
+          if (!superVariance.greaterThanOrEqual(typeParameter.variance)) {
+            if (!typeParameter.isLegacyCovariant) {
               errorReporter.atElement(
                 typeParameter,
                 CompileTimeErrorCode
                     .WRONG_EXPLICIT_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
                 arguments: [
                   typeParameter.name,
-                  typeParameterElementImpl.variance.keyword,
+                  typeParameter.variance.keyword,
                   superVariance.keyword,
                   superInterface,
                 ],
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 97a4833..27c4e89 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -118,7 +118,7 @@
       {required this.strictCasts});
 
   @override
-  void visitClassDeclaration(ClassDeclaration node) {
+  void visitClassDeclaration(covariant ClassDeclarationImpl node) {
     inCompound = false;
     compound = null;
     // Only the Allocator, Opaque and Struct class may be extended.
@@ -248,9 +248,10 @@
   }
 
   @override
-  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+  void visitFunctionExpressionInvocation(
+      covariant FunctionExpressionInvocationImpl node) {
     var element = node.element;
-    if (element is MethodElement2) {
+    if (element is MethodElement2OrMember) {
       var enclosingElement = element.enclosingElement2;
       if (enclosingElement.isAllocatorExtension &&
           element.name3 == _allocateExtensionMethodName) {
@@ -261,7 +262,7 @@
   }
 
   @override
-  void visitIndexExpression(IndexExpression node) {
+  void visitIndexExpression(covariant IndexExpressionImpl node) {
     var element = node.element;
     if (element is MethodElement2) {
       var enclosingElement = element.enclosingElement2;
@@ -334,7 +335,7 @@
   @override
   void visitMethodInvocation(covariant MethodInvocationImpl node) {
     var element = node.methodName.element;
-    if (element is MethodElement2) {
+    if (element is MethodElement2OrMember) {
       var enclosingElement = element.enclosingElement2;
       if (enclosingElement.isPointer) {
         if (element.name3 == 'fromFunction') {
@@ -375,7 +376,7 @@
   }
 
   @override
-  void visitPrefixedIdentifier(PrefixedIdentifier node) {
+  void visitPrefixedIdentifier(covariant PrefixedIdentifierImpl node) {
     var element = node.element;
     if (element != null) {
       var enclosingElement = element.enclosingElement2;
@@ -394,7 +395,7 @@
   }
 
   @override
-  void visitPropertyAccess(PropertyAccess node) {
+  void visitPropertyAccess(covariant PropertyAccessImpl node) {
     var element = node.propertyName.element;
     if (element != null) {
       var enclosingElement = element.enclosingElement2;
@@ -429,7 +430,7 @@
     super.visitTopLevelVariableDeclaration(node);
   }
 
-  DartType? _canonicalFfiTypeForDartType(DartType dartType) {
+  TypeImpl? _canonicalFfiTypeForDartType(TypeImpl dartType) {
     if (dartType.isPointer || dartType.isCompoundSubtype || dartType.isArray) {
       return dartType;
     } else {
@@ -550,13 +551,13 @@
     Token errorToken,
     Element2 declarationElement,
     NodeList<Annotation> metadata,
-    DartType ffiSignature,
+    TypeImpl ffiSignature,
     DartObject annotationValue,
     bool allowVariableLength,
   ) {
-    DartType type;
+    TypeImpl type;
 
-    if (declarationElement is FieldElement2) {
+    if (declarationElement is FieldElement2OrMember) {
       if (!declarationElement.isStatic) {
         _errorReporter.atToken(
           errorToken,
@@ -564,9 +565,9 @@
         );
       }
       type = declarationElement.type;
-    } else if (declarationElement is TopLevelVariableElement2) {
+    } else if (declarationElement is TopLevelVariableElementImpl2) {
       type = declarationElement.type;
-    } else if (declarationElement is PropertyAccessorElement2) {
+    } else if (declarationElement is PropertyAccessorElement2OrMember) {
       var variable = declarationElement.variable3;
       if (variable == null) {
         return;
@@ -628,7 +629,7 @@
 
   void _checkFfiNativeFunction(
     Token errorToken,
-    ExecutableElement2 declarationElement,
+    ExecutableElement2OrMember declarationElement,
     FunctionTypeImpl ffiSignature,
     DartObject annotationValue,
     List<FormalParameter> formalParameters,
@@ -815,8 +816,8 @@
 
   /// Validates that the given type is a valid dart:ffi native function
   /// signature.
-  bool _isValidFfiNativeFunctionType(DartType nativeType) {
-    if (nativeType is FunctionType && !nativeType.isDartCoreFunction) {
+  bool _isValidFfiNativeFunctionType(TypeImpl nativeType) {
+    if (nativeType is FunctionTypeImpl && !nativeType.isDartCoreFunction) {
       if (nativeType.namedParameterTypes.isNotEmpty ||
           nativeType.optionalParameterTypes.isNotEmpty) {
         return false;
@@ -826,8 +827,7 @@
         return false;
       }
 
-      for (DartType typeArg
-          in nativeType.normalParameterTypes.flattenVarArgs()) {
+      for (var typeArg in nativeType.normalParameterTypes.flattenVarArgs()) {
         if (!_isValidFfiNativeType(typeArg, allowHandle: true)) {
           return false;
         }
@@ -839,14 +839,14 @@
 
   /// Validates that the given [nativeType] is a valid dart:ffi native type.
   bool _isValidFfiNativeType(
-    DartType? nativeType, {
+    TypeImpl? nativeType, {
     bool allowVoid = false,
     bool allowEmptyStruct = false,
     bool allowArray = false,
     bool allowHandle = false,
     bool allowOpaque = false,
   }) {
-    if (nativeType is InterfaceType) {
+    if (nativeType is InterfaceTypeImpl) {
       var primitiveType = _primitiveNativeType(nativeType);
       switch (primitiveType) {
         case _PrimitiveDartType.void_:
@@ -899,7 +899,7 @@
       if (allowArray && nativeType.isArray) {
         return _isValidFfiNativeType(nativeType.typeArguments.single);
       }
-    } else if (nativeType is FunctionType) {
+    } else if (nativeType is FunctionTypeImpl) {
       return _isValidFfiNativeFunctionType(nativeType);
     }
     return false;
@@ -1166,12 +1166,12 @@
     );
   }
 
-  void _validateAllocate(FunctionExpressionInvocation node) {
+  void _validateAllocate(FunctionExpressionInvocationImpl node) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType dartType = typeArgumentTypes[0];
+    var dartType = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(dartType,
         allowVoid: true, allowEmptyStruct: true)) {
       AstNode errorNode = node;
@@ -1234,7 +1234,8 @@
 
   /// Validate the invocation of the instance method
   /// `Pointer<T>.asFunction<F>()`.
-  void _validateAsFunction(MethodInvocation node, MethodElement2 element) {
+  void _validateAsFunction(
+      covariant MethodInvocationImpl node, MethodElement2OrMember element) {
     var typeArguments = node.typeArguments?.arguments;
     AstNode errorNode = typeArguments != null ? typeArguments[0] : node;
     if (typeArguments != null && typeArguments.length == 1) {
@@ -1244,12 +1245,12 @@
     }
     var target = node.realTarget!;
     var targetType = target.staticType;
-    if (targetType is InterfaceType && targetType.isPointer) {
-      DartType T = targetType.typeArguments[0];
+    if (targetType is InterfaceTypeImpl && targetType.isPointer) {
+      var T = targetType.typeArguments[0];
       if (!T.isNativeFunction) {
         return;
       }
-      DartType pointerTypeArg = (T as InterfaceType).typeArguments.single;
+      var pointerTypeArg = (T as InterfaceTypeImpl).typeArguments.single;
       if (pointerTypeArg is TypeParameterType) {
         _errorReporter.atNode(
           target,
@@ -1267,8 +1268,8 @@
         return;
       }
 
-      DartType TPrime = T.typeArguments[0];
-      DartType F = node.typeArgumentTypes![0];
+      var TPrime = T.typeArguments[0];
+      var F = node.typeArgumentTypes![0];
       var isLeaf = _isLeaf(node.argumentList.arguments);
       if (!_validateCompatibleFunctionTypes(
           _FfiTypeCheckDirection.nativeToDart, F, TPrime)) {
@@ -1291,15 +1292,15 @@
   /// types, and subtyping is allowed in either direction.
   bool _validateCompatibleFunctionTypes(
     _FfiTypeCheckDirection direction,
-    DartType dartType,
-    DartType nativeType, {
+    TypeImpl dartType,
+    TypeImpl nativeType, {
     bool nativeFieldWrappersAsPointer = false,
     bool permissiveReturnType = false,
   }) {
     // We require both to be valid function types.
-    if (dartType is! FunctionType ||
+    if (dartType is! FunctionTypeImpl ||
         dartType.isDartCoreFunction ||
-        nativeType is! FunctionType ||
+        nativeType is! FunctionTypeImpl ||
         nativeType.isDartCoreFunction) {
       return false;
     }
@@ -1360,14 +1361,14 @@
   /// [_FfiTypeCheckDirection.dartToNative].
   bool _validateCompatibleNativeType(
     _FfiTypeCheckDirection direction,
-    DartType dartType,
-    DartType nativeType, {
+    TypeImpl dartType,
+    TypeImpl nativeType, {
     bool nativeFieldWrappersAsPointer = false,
     bool allowFunctions = false,
   }) {
     var nativeReturnType = _primitiveNativeType(nativeType);
     if (nativeReturnType == _PrimitiveDartType.int ||
-        (nativeType is InterfaceType &&
+        (nativeType is InterfaceTypeImpl &&
             nativeType.superclass?.element3.name3 ==
                 _abiSpecificIntegerClassName)) {
       return dartType.isDartCoreInt;
@@ -1390,7 +1391,8 @@
         case _FfiTypeCheckDirection.nativeToDart:
           return typeSystem.isSubtypeOf(typeSystem.objectNone, dartType);
       }
-    } else if (dartType is InterfaceType && nativeType is InterfaceType) {
+    } else if (dartType is InterfaceTypeImpl &&
+        nativeType is InterfaceTypeImpl) {
       if (nativeFieldWrappersAsPointer &&
           _extendsNativeFieldWrapperClass1(dartType)) {
         // Must be `Pointer<Void>`, `Handle` already checked above.
@@ -1406,9 +1408,9 @@
       return direction == _FfiTypeCheckDirection.dartToNative
           ? typeSystem.isSubtypeOf(dartType, nativeType)
           : typeSystem.isSubtypeOf(nativeType, dartType);
-    } else if (dartType is FunctionType &&
+    } else if (dartType is FunctionTypeImpl &&
         allowFunctions &&
-        nativeType is InterfaceType &&
+        nativeType is InterfaceTypeImpl &&
         nativeType.isNativeFunction) {
       var nativeFunction = nativeType.typeArguments[0];
       return _validateCompatibleFunctionTypes(
@@ -1421,12 +1423,12 @@
     }
   }
 
-  void _validateCreate(MethodInvocation node, String errorClass) {
+  void _validateCreate(MethodInvocationImpl node, String errorClass) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType dartType = typeArgumentTypes[0];
+    var dartType = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(dartType)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -1439,8 +1441,8 @@
 
   void _validateElementAt(MethodInvocation node) {
     var targetType = node.realTarget?.staticType;
-    if (targetType is InterfaceType && targetType.isPointer) {
-      DartType T = targetType.typeArguments[0];
+    if (targetType is InterfaceTypeImpl && targetType.isPointer) {
+      var T = targetType.typeArguments[0];
 
       if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) {
         AstNode errorNode = node;
@@ -1576,7 +1578,8 @@
 
   /// Validate the invocation of the static method
   /// `Pointer<T>.fromFunction(f, e)`.
-  void _validateFromFunction(MethodInvocation node, MethodElement2 element) {
+  void _validateFromFunction(
+      MethodInvocationImpl node, MethodElement2 element) {
     int argCount = node.argumentList.arguments.length;
     if (argCount < 1 || argCount > 2) {
       // There are other diagnostics reported against the invocation and the
@@ -1584,7 +1587,7 @@
       return;
     }
 
-    DartType T = node.typeArgumentTypes![0];
+    var T = node.typeArgumentTypes![0];
     if (!_isValidFfiNativeFunctionType(T)) {
       AstNode errorNode = node.methodName;
       var typeArgument = node.typeArguments?.arguments[0];
@@ -1599,8 +1602,8 @@
       return;
     }
 
-    Expression f = node.argumentList.arguments[0];
-    DartType FT = f.typeOrThrow;
+    var f = node.argumentList.arguments[0];
+    var FT = f.typeOrThrow;
     if (!_validateCompatibleFunctionTypes(
         _FfiTypeCheckDirection.dartToNative, FT, T)) {
       _errorReporter.atNode(
@@ -1612,7 +1615,7 @@
     }
 
     // TODO(brianwilkerson): Validate that `f` is a top-level function.
-    DartType R = (T as FunctionType).returnType;
+    var R = (T as FunctionTypeImpl).returnType;
     if (_primitiveNativeType(R) == _PrimitiveDartType.void_ ||
         R.isPointer ||
         R.isHandle ||
@@ -1674,7 +1677,7 @@
 
   /// Validate the invocation of the instance method
   /// `DynamicLibrary.lookupFunction<S, F>()`.
-  void _validateLookupFunction(MethodInvocation node) {
+  void _validateLookupFunction(MethodInvocationImpl node) {
     var typeArguments = node.typeArguments?.arguments;
     if (typeArguments == null || typeArguments.length != 2) {
       // There are other diagnostics reported against the invocation and the
@@ -1682,9 +1685,9 @@
       return;
     }
 
-    List<DartType> argTypes = node.typeArgumentTypes!;
-    DartType S = argTypes[0];
-    DartType F = argTypes[1];
+    var argTypes = node.typeArgumentTypes!;
+    var S = argTypes[0];
+    var F = argTypes[1];
     if (!_isValidFfiNativeFunctionType(S)) {
       AstNode errorNode = typeArguments[0];
       _errorReporter.atNode(
@@ -1744,7 +1747,7 @@
             // When referencing a function, the target type must be a
             // `NativeFunction<T>` so that `T` matches the type from the
             // annotation.
-            if (targetType case InterfaceType(isNativeFunction: true)) {
+            if (targetType case InterfaceTypeImpl(isNativeFunction: true)) {
               var targetFunctionType = targetType.typeArguments[0];
               if (!typeSystem.isEqualTo(nativeType, targetFunctionType)) {
                 _errorReporter.atNode(
@@ -1779,7 +1782,7 @@
                   );
                 }
 
-                if (targetType case InterfaceType(isNativeFunction: true)) {
+                if (targetType case InterfaceTypeImpl(isNativeFunction: true)) {
                   var targetFunctionType = targetType.typeArguments[0];
                   if (!typeSystem.isEqualTo(staticType, targetFunctionType)) {
                     _errorReporter.atNode(
@@ -1840,6 +1843,8 @@
     }
 
     var typeArg = (node.staticType as ParameterizedType).typeArguments[0];
+    // TODO(scheglov): eliminate this cast
+    typeArg as TypeImpl;
     if (!_isValidFfiNativeFunctionType(typeArg)) {
       _errorReporter.atNode(
         node.constructorName,
@@ -1861,7 +1866,7 @@
       return;
     }
 
-    var natRetType = (typeArg as FunctionType).returnType;
+    var natRetType = (typeArg as FunctionTypeImpl).returnType;
     if (isolateLocal) {
       if (_primitiveNativeType(natRetType) == _PrimitiveDartType.void_ ||
           natRetType.isPointer ||
@@ -1957,8 +1962,8 @@
     }
   }
 
-  void _validateRefIndexed(IndexExpression node) {
-    var targetType = node.realTarget.staticType;
+  void _validateRefIndexed(IndexExpressionImpl node) {
+    var targetType = node.realTarget.typeOrThrow;
     if (!_isValidFfiNativeType(targetType,
         allowEmptyStruct: true, allowArray: true)) {
       AstNode errorNode = node;
@@ -1972,7 +1977,7 @@
 
   /// Validate the invocation of the extension method
   /// `Pointer<T extends Struct>.ref`.
-  void _validateRefPrefixedIdentifier(PrefixedIdentifier node) {
+  void _validateRefPrefixedIdentifier(PrefixedIdentifierImpl node) {
     var targetType = node.prefix.staticType;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       AstNode errorNode = node;
@@ -1984,8 +1989,8 @@
     }
   }
 
-  void _validateRefPropertyAccess(PropertyAccess node) {
-    var targetType = node.realTarget.staticType;
+  void _validateRefPropertyAccess(PropertyAccessImpl node) {
+    var targetType = node.realTarget.typeOrThrow;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -1999,8 +2004,8 @@
   /// Validate the invocation of the
   /// `Pointer<T extends Struct>.refWithFinalizer` and
   /// `Pointer<T extends Union>.refWithFinalizer` extension methods.
-  void _validateRefWithFinalizer(MethodInvocation node) {
-    var targetType = node.realTarget?.staticType;
+  void _validateRefWithFinalizer(MethodInvocationImpl node) {
+    var targetType = node.realTarget?.typeOrThrow;
     if (!_isValidFfiNativeType(targetType, allowEmptyStruct: true)) {
       _errorReporter.atNode(
         node,
@@ -2010,12 +2015,12 @@
     }
   }
 
-  void _validateSizeOf(MethodInvocation node) {
+  void _validateSizeOf(MethodInvocationImpl node) {
     var typeArgumentTypes = node.typeArgumentTypes;
     if (typeArgumentTypes == null || typeArgumentTypes.length != 1) {
       return;
     }
-    DartType T = typeArgumentTypes[0];
+    var T = typeArgumentTypes[0];
     if (!_isValidFfiNativeType(T, allowVoid: true, allowEmptyStruct: true)) {
       AstNode errorNode = node;
       _errorReporter.atNode(
@@ -2725,7 +2730,7 @@
   }
 }
 
-extension on List<DartType> {
+extension on List<TypeImpl> {
   /// Removes the VarArgs from a DartType list.
   ///
   /// ```
@@ -2733,7 +2738,7 @@
   /// [Int8, VarArgs<(Int8,)>] -> [Int8, Int8]
   /// [Int8, VarArgs<(Int8, Int8)>] -> [Int8, Int8, Int8]
   /// ```
-  List<DartType> flattenVarArgs() {
+  List<TypeImpl> flattenVarArgs() {
     if (isEmpty) {
       return this;
     }
@@ -2741,8 +2746,8 @@
     if (!last.isVarArgs) {
       return this;
     }
-    var typeArgument = (last as InterfaceType).typeArguments.single;
-    if (typeArgument is! RecordType) {
+    var typeArgument = (last as InterfaceTypeImpl).typeArguments.single;
+    if (typeArgument is! RecordTypeImpl) {
       return this;
     }
     if (typeArgument.namedFields.isNotEmpty) {
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index dc533eb..a1d2199 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -178,7 +178,7 @@
   /// same contexttype
   /// </blockquote>
   void visitIntegerLiteral(IntegerLiteralImpl node,
-      {required DartType contextType}) {
+      {required TypeImpl contextType}) {
     var strictCasts = _resolver.analysisOptions.strictCasts;
     if (_typeSystem.isAssignableTo(_typeProvider.intType, contextType,
             strictCasts: strictCasts) ||
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element2.dart b/pkg/analyzer/lib/src/test_utilities/find_element2.dart
index 2e484a5..78b43a5 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element2.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element2.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element2.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/test_utilities/function_ast_visitor.dart';
 import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:collection/collection.dart';
@@ -479,10 +480,10 @@
     return topVar(name).setter2!;
   }
 
-  TopLevelVariableElement2 topVar(String name) {
+  TopLevelVariableElementImpl2 topVar(String name) {
     for (var variable in libraryElement.topLevelVariables) {
       if (variable.name3 == name) {
-        return variable;
+        return variable as TopLevelVariableElementImpl2;
       }
     }
     throw StateError('Not found: $name');
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index e8edfbb..4df71ba 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -460,6 +460,16 @@
   }
 }
 
+extension FieldElementOrMemberExtension on FieldElementOrMember {
+  FieldElement2OrMember get asElement2 {
+    return switch (this) {
+      FieldElementImpl(:var element) => element,
+      FieldMember member => member,
+      _ => throw UnsupportedError('Unsupported type: $runtimeType'),
+    };
+  }
+}
+
 extension FormalParameterElementExtension on FormalParameterElement {
   ParameterElement get asElement {
     if (this case ParameterMember member) {
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 6a51b9f..4f84398 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -121,13 +121,12 @@
     // No code needs to be analyzed but we still need to call
     // assertNoErrorsInCode to get the typeProvider initialized.
     await assertNoErrorsInCode('');
-    InterfaceType intType = typeProvider.intType;
-    DartType dynamicType = typeProvider.dynamicType;
-    InterfaceType futureDynamicType = typeProvider.futureDynamicType;
-    InterfaceType futureIntType = typeProvider.futureType(intType);
-    InterfaceType futureFutureDynamicType =
-        typeProvider.futureType(futureDynamicType);
-    InterfaceType futureFutureIntType = typeProvider.futureType(futureIntType);
+    var intType = typeProvider.intType;
+    var dynamicType = typeProvider.dynamicType;
+    var futureDynamicType = typeProvider.futureDynamicType;
+    var futureIntType = typeProvider.futureType(intType);
+    var futureFutureDynamicType = typeProvider.futureType(futureDynamicType);
+    var futureFutureIntType = typeProvider.futureType(futureIntType);
     // flatten(int) = int
     expect(_flatten(intType), intType);
     // flatten(dynamic) = dynamic
@@ -406,5 +405,5 @@
     expect(node.staticType, same(typeProvider.bottomType));
   }
 
-  TypeImpl _flatten(DartType type) => typeSystem.flatten(type as TypeImpl);
+  TypeImpl _flatten(TypeImpl type) => typeSystem.flatten(type);
 }
diff --git a/pkg/analyzer/test/src/dart/element/assignable_test.dart b/pkg/analyzer/test/src/dart/element/assignable_test.dart
index 45afa00..239626b 100644
--- a/pkg/analyzer/test/src/dart/element/assignable_test.dart
+++ b/pkg/analyzer/test/src/dart/element/assignable_test.dart
@@ -2,7 +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/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -18,12 +18,12 @@
 class IsAssignableToTest extends AbstractTypeSystemTest {
   bool get strictCasts => analysisContext.analysisOptions.strictCasts;
 
-  void isAssignable(DartType from, DartType to) {
+  void isAssignable(TypeImpl from, TypeImpl to) {
     expect(
         typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isTrue);
   }
 
-  void isNotAssignable(DartType from, DartType to) {
+  void isNotAssignable(TypeImpl from, TypeImpl to) {
     expect(
         typeSystem.isAssignableTo(from, to, strictCasts: strictCasts), isFalse);
   }