diff --git a/pkg/analyzer/lib/dart/element/element2.dart b/pkg/analyzer/lib/dart/element/element2.dart
index 8220877..a85edba 100644
--- a/pkg/analyzer/lib/dart/element/element2.dart
+++ b/pkg/analyzer/lib/dart/element/element2.dart
@@ -2561,6 +2561,10 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class TopLevelFunctionElement
     implements ExecutableElement2, HasSinceSdkVersion {
+  /// The name of the synthetic function defined for libraries that are
+  /// deferred.
+  static final String LOAD_LIBRARY_NAME = "loadLibrary";
+
   @override
   TopLevelFunctionElement get baseElement;
 
diff --git a/pkg/analyzer/lib/dart/element/scope.dart b/pkg/analyzer/lib/dart/element/scope.dart
index 61d0037..bc8d49b 100644
--- a/pkg/analyzer/lib/dart/element/scope.dart
+++ b/pkg/analyzer/lib/dart/element/scope.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Scopes are used to resolve names to elements.
 ///
@@ -23,8 +24,10 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ScopeLookupResult {
-  Element? get getter;
+  Element? get getter => getter2?.asElement;
   Element2? get getter2;
-  Element? get setter;
+
+  Element? get setter => setter2?.asElement;
+
   Element2? get setter2;
 }
diff --git a/pkg/analyzer/lib/src/dart/ast/extensions.dart b/pkg/analyzer/lib/src/dart/ast/extensions.dart
index b40317e..aaff107 100644
--- a/pkg/analyzer/lib/src/dart/ast/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/ast/extensions.dart
@@ -279,14 +279,14 @@
         name2: self.identifier.token,
         typeArguments: typeArguments,
         question: question,
-      )..element2 = self.identifier.staticElement.asElement2;
+      )..element2 = self.identifier.staticElement?.asElement2;
     } else if (self is SimpleIdentifierImpl) {
       return NamedTypeImpl(
         importPrefix: null,
         name2: self.token,
         typeArguments: typeArguments,
         question: question,
-      )..element2 = self.staticElement.asElement2;
+      )..element2 = self.staticElement?.asElement2;
     } else {
       throw UnimplementedError('(${self.runtimeType}) $self');
     }
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 959c4d9..69c0e25 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -683,6 +683,10 @@
   @override
   bool get isDartCoreObject => firstFragment.isDartCoreObject;
 
+  bool get isDartCoreRecord {
+    return name3 == 'Record' && library2.isDartCore;
+  }
+
   bool get isEnumLike {
     // Must be a concrete class.
     if (isAbstract) {
@@ -844,14 +848,12 @@
 
   @override
   List<ExtensionElement> get accessibleExtensions {
-    return scope.accessibleExtensions;
+    return scope.accessibleExtensions.map((e) => e.asElement).toList();
   }
 
   @override
   List<ExtensionElement2> get accessibleExtensions2 {
-    return scope.accessibleExtensions
-        .map((element) => element.augmented as ExtensionElement2)
-        .toList();
+    return scope.accessibleExtensions;
   }
 
   @override
@@ -9851,6 +9853,10 @@
     return asElement.scope;
   }
 
+  set scope(PrefixScope value) {
+    asElement.scope = value;
+  }
+
   @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
     return visitor.visitPrefixElement(this);
diff --git a/pkg/analyzer/lib/src/dart/element/scope.dart b/pkg/analyzer/lib/src/dart/element/scope.dart
index b83db1d..ca9f6f2 100644
--- a/pkg/analyzer/lib/src/dart/element/scope.dart
+++ b/pkg/analyzer/lib/src/dart/element/scope.dart
@@ -2,29 +2,26 @@
 // 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.
 
-// ignore_for_file: analyzer_use_new_elements
-
 import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
 import 'package:analyzer/dart/analysis/features.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/dart/element/scope.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/extensions.dart';
 import 'package:analyzer/src/summary2/combinator.dart';
 import 'package:analyzer/src/utilities/extensions/collection.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// The scope for the initializers in a constructor.
 class ConstructorInitializerScope extends EnclosedScope {
-  ConstructorInitializerScope(super.parent, ConstructorElement element) {
-    for (var parameter in element.parameters) {
+  ConstructorInitializerScope(super.parent, ConstructorElement2 element) {
+    var hasWildcardVariables =
+        element.library2.featureSet.isEnabled(Feature.wildcard_variables);
+    for (var formalParameter in element.formalParameters) {
       // Skip wildcards.
-      if (parameter.name == '_' &&
-          element.library.featureSet.isEnabled(Feature.wildcard_variables)) {
+      if (formalParameter.name3 == '_' && hasWildcardVariables) {
         continue;
       }
-      _addGetter(parameter);
+      _addGetter(formalParameter);
     }
   }
 }
@@ -41,15 +38,15 @@
   Scope innerScope;
 
   DocumentationCommentScope(
-      this.innerScope, List<LibraryElement> docImportLibraries) {
+      this.innerScope, List<LibraryElement2> docImportLibraries) {
     for (var importedLibrary in docImportLibraries) {
       if (importedLibrary is LibraryElementImpl) {
         // TODO(kallentu): Handle combinators.
         for (var exportedReference in importedLibrary.exportedReferences) {
           var reference = exportedReference.reference;
           var element = importedLibrary.session.elementFactory
-              .elementOfReference(reference)!;
-          if (element is PropertyAccessorElement && element.isSetter) {
+              .elementOfReference2(reference)!;
+          if (element is SetterElement) {
             _addSetter(element);
           } else {
             _addGetter(element);
@@ -62,10 +59,10 @@
   @override
   ScopeLookupResult lookup(String id) {
     var result = innerScope.lookup(id);
-    if (result.getter != null || result.setter != null) return result;
+    if (result.getter2 != null || result.setter2 != null) return result;
     return ScopeLookupResultImpl(
-      getter: _getters[id],
-      setter: _setters[id],
+      getter2: _getters[id],
+      setter2: _setters[id],
     );
   }
 }
@@ -84,8 +81,8 @@
     var setter = _setters[id];
     if (getter != null || setter != null) {
       return ScopeLookupResultImpl(
-        getter: getter,
-        setter: setter,
+        getter2: getter,
+        setter2: setter,
       );
     }
 
@@ -97,21 +94,22 @@
 class ExtensionScope extends EnclosedScope {
   ExtensionScope(
     super.parent,
-    ExtensionElement element,
+    ExtensionElement2 element,
   ) {
-    element.accessors.forEach(_addPropertyAccessor);
-    element.methods.forEach(_addGetter);
+    element.getters2.forEach(_addGetter);
+    element.setters2.forEach(_addSetter);
+    element.methods2.forEach(_addGetter);
   }
 }
 
 class FormalParameterScope extends EnclosedScope {
   FormalParameterScope(
     super.parent,
-    List<ParameterElement> elements,
+    List<FormalParameterElement> elements,
   ) {
     for (var parameter in elements) {
-      if (parameter is! FieldFormalParameterElement &&
-          parameter is! SuperFormalParameterElement) {
+      if (parameter is! FieldFormalParameterElement2 &&
+          parameter is! SuperFormalParameterElement2) {
         if (!parameter.isWildcardVariable) {
           _addGetter(parameter);
         }
@@ -123,36 +121,26 @@
 /// Tracking information for all import in [CompilationUnitElementImpl].
 class ImportsTracking {
   /// Tracking information for each import prefix.
-  final Map<PrefixElementImpl?, ImportsTrackingOfPrefix> map;
+  final Map<PrefixElementImpl2?, ImportsTrackingOfPrefix> map;
 
   ImportsTracking({
     required this.map,
   });
 
   /// The elements that are used from [import].
-  Set<Element> elementsOf(LibraryImportElementImpl import) {
-    return trackerOf(import).importToUsedElements[import] ?? {};
+  Set<Element2> elementsOf(LibraryImportElementImpl import) {
+    return trackerOf(import)?.importToUsedElements[import] ?? {};
   }
 
-  /// The elements that are used from [import].
-  Set<Element2> elementsOf2(LibraryImportElementImpl import) {
-    return trackerOf(import)
-            .importToUsedElements[import]
-            ?.map((e) => e.asElement2)
-            .nonNulls
-            .toSet() ??
-        {};
-  }
-
-  void notifyExtensionUsed(ExtensionElement element) {
+  void notifyExtensionUsed(ExtensionElement2 element) {
     for (var tracking in map.values) {
       tracking.notifyExtensionUsed(element);
     }
   }
 
-  ImportsTrackingOfPrefix trackerOf(LibraryImportElementImpl import) {
-    var prefix = import.prefix?.element;
-    return map[prefix]!;
+  ImportsTrackingOfPrefix? trackerOf(LibraryImportElementImpl import) {
+    var prefix = import.prefix2?.element;
+    return map[prefix];
   }
 }
 
@@ -161,16 +149,16 @@
 
   /// Key: an element.
   /// Value: the imports that provide the element.
-  final Map<Element, List<LibraryImportElementImpl>> _elementImports = {};
+  final Map<Element2, List<LibraryImportElementImpl>> _elementImports = {};
 
   /// Key: an import.
   /// Value: used elements imported from the import.
-  final Map<LibraryImportElementImpl, Set<Element>> importToUsedElements = {};
+  final Map<LibraryImportElementImpl, Set<Element2>> importToUsedElements = {};
 
   /// Key: an import.
   /// Value: used elements imported from the import.
   /// Excludes elements from deprecated exports.
-  final Map<LibraryImportElementImpl, Set<Element>> importToAccessedElements2 =
+  final Map<LibraryImportElementImpl, Set<Element2>> importToAccessedElements2 =
       {};
 
   /// Usually it is an error to use an import prefix without `.identifier`
@@ -187,13 +175,8 @@
     _buildElementToImportsMap();
   }
 
-  Map<LibraryImportElementImpl, Set<Element2>> get importToUsedElements2 {
-    return importToUsedElements.mapValue(
-        (elements) => elements.map((e) => e.asElement2).nonNulls.toSet());
-  }
-
   /// The elements that are used from [import].
-  Set<Element> elementsOf(LibraryImportElementImpl import) {
+  Set<Element2> elementsOf(LibraryImportElementImpl import) {
     return importToUsedElements[import] ?? {};
   }
 
@@ -202,7 +185,7 @@
   Set<Element2> elementsOf2(LibraryImportElementImpl import) {
     var result = importToAccessedElements2[import];
     if (result != null) {
-      return result.map((e) => e.asElement2).nonNulls.toSet();
+      return result;
     }
 
     var accessedElements = elementsOf(import);
@@ -213,7 +196,7 @@
 
     for (var exportedReference in importedLibrary.exportedReferences) {
       var reference = exportedReference.reference;
-      var element = elementFactory.elementOfReference(reference)!;
+      var element = elementFactory.elementOfReference2(reference)!;
 
       // Check only accessed elements.
       if (!accessedElements.contains(element)) {
@@ -231,11 +214,10 @@
     }
 
     result ??= accessedElements;
-    importToAccessedElements2[import] = result;
-    return result.map((e) => e.asElement2).nonNulls.toSet();
+    return importToAccessedElements2[import] = result;
   }
 
-  void lookupResult(Element? element) {
+  void lookupResult(Element2? element) {
     if (!active) {
       return;
     }
@@ -244,7 +226,7 @@
       return;
     }
 
-    if (element is MultiplyDefinedElement) {
+    if (element is MultiplyDefinedElement2) {
       return;
     }
 
@@ -255,7 +237,7 @@
     }
   }
 
-  void notifyExtensionUsed(ExtensionElement element) {
+  void notifyExtensionUsed(ExtensionElement2 element) {
     var imports = _elementImports[element];
     if (imports != null) {
       for (var import in imports) {
@@ -282,7 +264,7 @@
       for (var exportedReference in importedLibrary.exportedReferences) {
         var reference = exportedReference.reference;
         if (combinators.allows(reference.name)) {
-          var element = elementFactory.elementOfReference(reference)!;
+          var element = elementFactory.elementOfReference2(reference)!;
           (_elementImports[element] ??= []).add(import);
         }
       }
@@ -292,65 +274,48 @@
 
 /// The scope defined by an instance element.
 class InstanceScope extends EnclosedScope {
-  InstanceScope(super.parent, InstanceElement element) {
-    var augmented = element.augmented;
-    augmented.accessors.forEach(_addPropertyAccessor);
-    augmented.methods.forEach(_addGetter);
+  InstanceScope(super.parent, InstanceElement2 element) {
+    element.getters2.forEach(_addGetter);
+    element.setters2.forEach(_addSetter);
+    element.methods2.forEach(_addGetter);
   }
 }
 
 /// The top-level declarations of the library.
 class LibraryDeclarations with _GettersAndSetters {
-  List<ExtensionElement> extensions = [];
+  List<ExtensionElement2> extensions = [];
 
   LibraryDeclarations(LibraryElementImpl library) {
-    library.units.forEach(_addLibraryFragment);
+    library.getters.forEach(_addGetter);
+    library.enums.forEach(_addGetter);
+    library.extensions.forEach(_addExtension);
+    library.extensionTypes.forEach(_addGetter);
+    library.setters.forEach(_addSetter);
+    library.topLevelFunctions.forEach(_addGetter);
+    library.typeAliases.forEach(_addGetter);
+    library.mixins.forEach(_addGetter);
+    library.classes.forEach(_addGetter);
 
     // Add implicit 'dart:core' declarations.
     if ('${library.source.uri}' == 'dart:core') {
-      _addGetter(DynamicElementImpl.instance);
-      _addGetter(NeverElementImpl.instance);
+      _addGetter(DynamicElementImpl2.instance);
+      _addGetter(NeverElementImpl2.instance);
     }
 
     extensions = extensions.toFixedList();
   }
 
   /// Returns a getter or setter with the [name].
-  Element? withName(String name) {
+  Element2? withName(String name) {
     return _getters[name] ?? _setters[name];
   }
 
-  void _addExtension(ExtensionElement element) {
-    if (element.isAugmentation) {
-      return;
-    }
-
+  void _addExtension(ExtensionElement2 element) {
     _addGetter(element);
     if (!extensions.contains(element)) {
       extensions.add(element);
     }
   }
-
-  void _addLibraryFragment(CompilationUnitElement fragment) {
-    for (var element in fragment.accessors) {
-      if (element.augmentation == null) {
-        _addPropertyAccessor(element);
-      }
-    }
-
-    for (var element in fragment.functions) {
-      if (element.augmentation == null) {
-        _addGetter(element);
-      }
-    }
-
-    fragment.enums.forEach(_addGetter);
-    fragment.extensions.forEach(_addExtension);
-    fragment.extensionTypes.forEach(_addGetter);
-    fragment.typeAliases.forEach(_addGetter);
-    fragment.mixins.forEach(_addGetter);
-    fragment.classes.forEach(_addGetter);
-  }
 }
 
 class LibraryFragmentScope implements Scope {
@@ -358,10 +323,10 @@
   final CompilationUnitElementImpl fragment;
   final PrefixScope noPrefixScope;
 
-  final Map<String, PrefixElementImpl> _prefixElements = {};
+  final Map<String, PrefixElementImpl2> _prefixElements = {};
 
   /// The cached result for [accessibleExtensions].
-  List<ExtensionElement>? _extensions;
+  List<ExtensionElement2>? _extensions;
 
   /// This field is set temporarily while resolving all files of a library.
   /// So, we can track which elements were actually returned, and which imports
@@ -390,8 +355,10 @@
     required this.fragment,
     required this.noPrefixScope,
   }) {
-    for (var prefix in fragment.libraryImportPrefixes) {
-      _prefixElements[prefix.name] = prefix;
+    for (var prefix in fragment.prefixes) {
+      if (prefix.name3 case var name?) {
+        _prefixElements[name] = prefix;
+      }
       prefix.scope = PrefixScope(
         libraryFragment: fragment,
         parent: _getParentPrefixScope(prefix),
@@ -402,7 +369,7 @@
   }
 
   /// The extensions accessible within [fragment].
-  List<ExtensionElement> get accessibleExtensions {
+  List<ExtensionElement2> get accessibleExtensions {
     var libraryDeclarations = fragment.library.libraryDeclarations;
     return _extensions ??= {
       ...libraryDeclarations.extensions,
@@ -456,25 +423,25 @@
 
     // No result.
     return ScopeLookupResultImpl(
-      getter: null,
-      setter: null,
+      getter2: null,
+      setter2: null,
     );
   }
 
   void notifyExtensionUsed(ExtensionElement2 element) {
-    _importsTracking?.notifyExtensionUsed(element.asElement);
+    _importsTracking?.notifyExtensionUsed(element);
   }
 
-  PrefixScope? _getParentPrefixScope(PrefixElementImpl prefix) {
+  PrefixScope? _getParentPrefixScope(PrefixElementImpl2 prefix) {
     var isDeferred = prefix.imports.any((import) {
-      return import.prefix is DeferredImportElementPrefix;
+      return import.prefix2?.isDeferred ?? false;
     });
     if (isDeferred) {
       return null;
     }
 
     for (var scope = parent; scope != null; scope = scope.parent) {
-      var parentPrefix = scope._prefixElements[prefix.name];
+      var parentPrefix = scope._prefixElements[prefix.name3];
       if (parentPrefix != null) {
         return parentPrefix.scope;
       }
@@ -487,15 +454,15 @@
     if (_shouldTryPrefixElement(id)) {
       if (_prefixElements[id] case var prefixElement?) {
         return ScopeLookupResultImpl(
-          getter: prefixElement,
-          setter: null,
+          getter2: prefixElement,
+          setter2: null,
         );
       }
     }
 
     // Try imports of the library fragment.
     var noPrefixResult = noPrefixScope.lookup(id);
-    if (noPrefixResult.getter != null || noPrefixResult.setter != null) {
+    if (noPrefixResult.getter2 != null || noPrefixResult.setter2 != null) {
       return noPrefixResult;
     }
 
@@ -509,8 +476,8 @@
     var librarySetter = libraryDeclarations._setters[id];
     if (libraryGetter != null || librarySetter != null) {
       return ScopeLookupResultImpl(
-        getter: libraryGetter,
-        setter: librarySetter,
+        getter2: libraryGetter,
+        setter2: librarySetter,
       );
     }
     return null;
@@ -528,7 +495,7 @@
 class LocalScope extends EnclosedScope {
   LocalScope(super.parent);
 
-  void add(Element element) {
+  void add(Element2 element) {
     if (!element.isWildcardVariable) {
       _addGetter(element);
     }
@@ -541,12 +508,12 @@
 
   final List<LibraryImportElementImpl> _importElements = [];
 
-  final Map<String, Element> _getters = {};
-  final Map<String, Element> _setters = {};
+  final Map<String, Element2> _getters = {};
+  final Map<String, Element2> _setters = {};
   Set<String>? _settersFromDeprecatedExport;
   Set<String>? _gettersFromDeprecatedExport;
-  final Set<ExtensionElement> _extensions = {};
-  LibraryElement? _deferredLibrary;
+  final Set<ExtensionElement2> _extensions = {};
+  LibraryElement2? _deferredLibrary;
 
   ImportsTrackingOfPrefix? _importsTracking;
 
@@ -554,20 +521,20 @@
     required this.libraryFragment,
     required this.parent,
     required List<LibraryImportElementImpl> libraryImports,
-    required PrefixElement? prefix,
+    required PrefixElement2? prefix,
   }) {
     var elementFactory = libraryElement.session.elementFactory;
     for (var import in libraryImports) {
       var importedUri = import.uri;
       if (importedUri is DirectiveUriWithLibraryImpl &&
-          import.prefix?.element == prefix) {
+          import.prefix2?.element == prefix) {
         _importElements.add(import);
         var importedLibrary = importedUri.library;
         var combinators = import.combinators.build();
         for (var exportedReference in importedLibrary.exportedReferences) {
           var reference = exportedReference.reference;
           if (combinators.allows(reference.name)) {
-            var element = elementFactory.elementOfReference(reference)!;
+            var element = elementFactory.elementOfReference2(reference)!;
             if (_shouldAdd(importedLibrary, element)) {
               _add(
                 element,
@@ -576,8 +543,10 @@
             }
           }
         }
-        if (import.prefix is DeferredImportElementPrefix) {
-          _deferredLibrary ??= importedLibrary;
+        if (import.prefix2 case var importPrefix?) {
+          if (importPrefix.isDeferred) {
+            _deferredLibrary ??= importedLibrary;
+          }
         }
       }
     }
@@ -600,10 +569,11 @@
   @override
   ScopeLookupResult lookup(String id) {
     var deferredLibrary = _deferredLibrary;
-    if (deferredLibrary != null && id == FunctionElement.LOAD_LIBRARY_NAME) {
+    if (deferredLibrary != null &&
+        id == TopLevelFunctionElement.LOAD_LIBRARY_NAME) {
       return ScopeLookupResultImpl(
-        getter: deferredLibrary.loadLibraryFunction,
-        setter: null,
+        getter2: deferredLibrary.loadLibraryFunction2,
+        setter2: null,
       );
     }
 
@@ -613,8 +583,8 @@
       _importsTracking?.lookupResult(getter);
       _importsTracking?.lookupResult(setter);
       return PrefixScopeLookupResult(
-        getter: getter,
-        setter: setter,
+        getter2: getter,
+        setter2: setter,
         getterIsFromDeprecatedExport:
             _gettersFromDeprecatedExport?.contains(id) ?? false,
         setterIsFromDeprecatedExport:
@@ -627,8 +597,8 @@
     }
 
     return ScopeLookupResultImpl(
-      getter: null,
-      setter: null,
+      getter2: null,
+      setter2: null,
     );
   }
 
@@ -637,8 +607,8 @@
     _importsTracking?.notifyPrefixUsedInCommentReference();
   }
 
-  void _add(Element element, bool isFromDeprecatedExport) {
-    if (element is PropertyAccessorElement && element.isSetter) {
+  void _add(Element2 element, bool isFromDeprecatedExport) {
+    if (element is SetterElement) {
       _addTo(
         element,
         isFromDeprecatedExport: isFromDeprecatedExport,
@@ -650,14 +620,14 @@
         isFromDeprecatedExport: isFromDeprecatedExport,
         isSetter: false,
       );
-      if (element is ExtensionElement) {
+      if (element is ExtensionElement2) {
         _extensions.add(element);
       }
     }
   }
 
   void _addTo(
-    Element element, {
+    Element2 element, {
     required bool isFromDeprecatedExport,
     required bool isSetter,
   }) {
@@ -693,7 +663,7 @@
     }
   }
 
-  Element _merge(Element existing, Element other) {
+  Element2 _merge(Element2 existing, Element2 other) {
     if (_isSdkElement(existing)) {
       if (!_isSdkElement(other)) {
         return other;
@@ -704,18 +674,18 @@
       }
     }
 
-    var conflictingElements = <Element>{};
+    var conflictingElements = <Element2>{};
     _addElement(conflictingElements, existing);
     _addElement(conflictingElements, other);
 
-    return MultiplyDefinedElementImpl(
+    return MultiplyDefinedElementImpl2(
       libraryFragment,
-      conflictingElements.first.name!,
+      conflictingElements.first.name3!,
       conflictingElements.toList(),
     );
   }
 
-  bool _shouldAdd(LibraryElementImpl importedLibrary, Element element) {
+  bool _shouldAdd(LibraryElementImpl importedLibrary, Element2 element) {
     // It is an error for the identifier `Record`, denoting the `Record` class
     // from `dart:core`, where that import scope name is only imported from
     // platform libraries, to appear in a library whose language version is
@@ -723,7 +693,7 @@
     // records are released.
     if (!libraryElement.featureSet.isEnabled(Feature.records)) {
       if (importedLibrary.isInSdk &&
-          element is ClassElementImpl &&
+          element is ClassElementImpl2 &&
           element.isDartCoreRecord) {
         return false;
       }
@@ -732,24 +702,24 @@
   }
 
   static void _addElement(
-    Set<Element> conflictingElements,
-    Element element,
+    Set<Element2> conflictingElements,
+    Element2 element,
   ) {
-    if (element is MultiplyDefinedElementImpl) {
-      conflictingElements.addAll(element.conflictingElements);
+    if (element is MultiplyDefinedElementImpl2) {
+      conflictingElements.addAll(element.conflictingElements2);
     } else {
       conflictingElements.add(element);
     }
   }
 
-  static bool _isSdkElement(Element element) {
-    if (element is DynamicElementImpl || element is NeverElementImpl) {
+  static bool _isSdkElement(Element2 element) {
+    if (element is DynamicElementImpl2 || element is NeverElementImpl2) {
       return true;
     }
-    if (element is MultiplyDefinedElement) {
+    if (element is MultiplyDefinedElement2) {
       return false;
     }
-    return element.library!.isInSdk;
+    return element.library2!.isInSdk;
   }
 }
 
@@ -760,8 +730,8 @@
   final int _deprecatedBits;
 
   PrefixScopeLookupResult({
-    required super.getter,
-    required super.setter,
+    required super.getter2,
+    required super.setter2,
     required bool getterIsFromDeprecatedExport,
     required bool setterIsFromDeprecatedExport,
   }) : _deprecatedBits = (getterIsFromDeprecatedExport
@@ -784,28 +754,23 @@
       (_deprecatedBits & setterIsFromDeprecatedExportBit) != 0;
 }
 
-class ScopeLookupResultImpl implements ScopeLookupResult {
+class ScopeLookupResultImpl extends ScopeLookupResult {
   @override
-  final Element? getter;
+  final Element2? getter2;
 
   @override
-  final Element? setter;
+  final Element2? setter2;
 
   ScopeLookupResultImpl({
-    required this.getter,
-    required this.setter,
+    required this.getter2,
+    required this.setter2,
   });
-
-  @override
-  Element2? get getter2 => getter?.asElement2;
-  @override
-  Element2? get setter2 => setter?.asElement2;
 }
 
 class TypeParameterScope extends EnclosedScope {
   TypeParameterScope(
     super.parent,
-    List<TypeParameterElement> elements,
+    List<TypeParameterElement2> elements,
   ) {
     for (var element in elements) {
       if (!element.isWildcardVariable) {
@@ -816,26 +781,18 @@
 }
 
 mixin _GettersAndSetters {
-  final Map<String, Element> _getters = {};
-  final Map<String, Element> _setters = {};
+  final Map<String, Element2> _getters = {};
+  final Map<String, Element2> _setters = {};
 
-  void _addGetter(Element element) {
-    var id = element.name;
+  void _addGetter(Element2 element) {
+    var id = element.lookupName;
     if (id != null) {
       _getters[id] ??= element;
     }
   }
 
-  void _addPropertyAccessor(PropertyAccessorElement element) {
-    if (element.isGetter) {
-      _addGetter(element);
-    } else {
-      _addSetter(element);
-    }
-  }
-
-  void _addSetter(Element element) {
-    var name = element.name;
+  void _addSetter(Element2 element) {
+    var name = element.lookupName;
     if (name != null && name.endsWith('=')) {
       var id = considerCanonicalizeString(name.substring(0, name.length - 1));
       _setters[id] ??= element;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 9400593..647f2c4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -675,7 +675,7 @@
     var variablesMap = _patternVariables.casePatternFinish();
     node.variables = variablesMap.values
         .whereType<BindPatternVariableElementImpl2>()
-        .map((e) => e.asElement as BindPatternVariableElementImpl)
+        .map((e) => e.asElement)
         .toList();
   }
 
@@ -1154,7 +1154,7 @@
     var variablesMap = _patternVariables.casePatternFinish();
     node.elements = variablesMap.values
         .whereType<BindPatternVariableElementImpl2>()
-        .map((e) => e.asElement as BindPatternVariableElementImpl)
+        .map((e) => e.asElement)
         .toList();
   }
 
@@ -1571,7 +1571,7 @@
 
   void _define(Element element) {
     if (_nameScope case LocalScope nameScope) {
-      nameScope.add(element);
+      nameScope.add(element.asElement2!);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
index c1380ea..0d046cf 100644
--- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
+++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 class DuplicateDefinitionVerifier {
   final LibraryElementImpl _currentLibrary;
@@ -170,7 +171,7 @@
           _diagnosticFactory.duplicateDefinition(
             CompileTimeErrorCode.PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER,
             importPrefix,
-            existing,
+            existing.asElement!,
             [name],
           ),
         );
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
index 69daba3..d4b49ad 100644
--- a/pkg/analyzer/lib/src/error/imports_verifier.dart
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -178,6 +178,9 @@
     for (var firstDirective in usedImports) {
       var firstElement = firstDirective.element!;
       var tracker = importsTracking.trackerOf(firstElement);
+      if (tracker == null) {
+        continue;
+      }
 
       // Ignore unresolved imports.
       var importedLibrary = firstElement.importedLibrary;
@@ -241,8 +244,12 @@
     for (var importDirective in fileAnalysis.unit.directives) {
       if (importDirective is ImportDirectiveImpl) {
         var importElement = importDirective.element!;
-        var prefixElement = importElement.prefix?.element;
-        var tracking = importsTracking.map[prefixElement]!;
+        var prefixElement = importElement.prefix2?.element;
+
+        var tracking = importsTracking.map[prefixElement];
+        if (tracking == null) {
+          continue;
+        }
 
         // Ignore the group of imports with a prefix in a comment reference.
         if (tracking.hasPrefixUsedInCommentReference) {
@@ -260,8 +267,7 @@
             continue;
           }
 
-          var isUsed =
-              tracking.importToUsedElements2.containsKey(importElement);
+          var isUsed = tracking.importToUsedElements.containsKey(importElement);
           if (!isUsed) {
             _unusedImports.add(importDirective);
             errorReporter.atNode(
@@ -310,7 +316,7 @@
           for (var identifier in combinator.shownNames) {
             var element = identifier.element;
             if (element != null) {
-              var importElements = importsTracking.elementsOf2(importElement);
+              var importElements = importsTracking.elementsOf(importElement);
 
               var isUsed = importElements.contains(element);
               if (element is PropertyInducingElement2) {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0cf11b9..147a842 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4564,7 +4564,7 @@
   ScopeResolverVisitor(
     this.errorReporter, {
     required this.nameScope,
-    List<LibraryElement> docImportLibraries = const [],
+    List<LibraryElement2> docImportLibraries = const [],
   }) : _docImportScope =
             DocumentationCommentScope(nameScope, docImportLibraries);
 
@@ -4610,10 +4610,10 @@
       Scope outerScope = nameScope;
       try {
         nameScope = LocalScope(nameScope);
-        _define(exception.declaredElement!);
+        _define(exception.declaredElement!.asElement2!);
         var stackTrace = node.stackTraceParameter;
         if (stackTrace != null) {
-          _define(stackTrace.declaredElement!);
+          _define(stackTrace.declaredElement!.asElement2!);
         }
         super.visitCatchClause(node);
       } finally {
@@ -4633,7 +4633,7 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
@@ -4642,7 +4642,7 @@
       node.implementsClause?.accept(this);
       node.nativeClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4657,8 +4657,11 @@
     try {
       ClassElement element = node.declaredElement!;
       nameScope = InstanceScope(
-        TypeParameterScope(nameScope, element.typeParameters),
-        element,
+        TypeParameterScope(
+          nameScope,
+          element.typeParameters.map((e) => e.asElement2).toList(),
+        ),
+        element.asElement2,
       );
       _visitDocumentationComment(node.documentationComment);
       node.typeParameters?.accept(this);
@@ -4690,7 +4693,7 @@
       try {
         nameScope = ConstructorInitializerScope(
           nameScope,
-          element,
+          element.asElement2,
         );
         node.initializers.accept(this);
         _visitDocumentationComment(node.documentationComment);
@@ -4702,7 +4705,7 @@
 
       nameScope = FormalParameterScope(
         nameScope,
-        element.parameters,
+        element.parameters.map((e) => e.asElement2).toList(),
       );
       node.body.accept(this);
     } finally {
@@ -4717,7 +4720,7 @@
 
   @override
   void visitDeclaredIdentifier(DeclaredIdentifier node) {
-    _define(node.declaredElement!);
+    _define(node.declaredElement!.asElement2!);
     super.visitDeclaredIdentifier(node);
   }
 
@@ -4750,14 +4753,14 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.withClause?.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.constants.accept(this);
       node.members.accept(this);
@@ -4781,13 +4784,13 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.onClause?.accept(this);
 
-      nameScope = ExtensionScope(nameScope, element);
+      nameScope = ExtensionScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4806,14 +4809,14 @@
 
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.representation.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -4845,7 +4848,7 @@
     node.iterable.accept(this);
 
     for (var variable in node.variables) {
-      _define(variable);
+      _define(variable.asElement2);
     }
 
     node.pattern.accept(this);
@@ -4875,19 +4878,19 @@
     if (parent is FunctionExpression) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement!.parameters,
+        parent.declaredElement!.parameters.map((e) => e.asElement2).toList(),
       );
     } else if (parent is FunctionTypeAlias) {
       var aliasedElement = parent.declaredElement!.aliasedElement;
       var functionElement = aliasedElement as GenericFunctionTypeElement;
       nameScope = FormalParameterScope(
         nameScope,
-        functionElement.parameters,
+        functionElement.parameters.map((e) => e.asElement2).toList(),
       );
     } else if (parent is MethodDeclaration) {
       nameScope = FormalParameterScope(
         nameScope,
-        parent.declaredElement!.parameters,
+        parent.declaredElement!.parameters.map((e) => e.asElement2).toList(),
       );
     }
   }
@@ -4921,7 +4924,7 @@
       var element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.returnType?.accept(this);
@@ -4951,8 +4954,11 @@
 
       ExecutableElement element = node.declaredElement!;
       nameScope = FormalParameterScope(
-        TypeParameterScope(nameScope, element.typeParameters),
-        element.parameters,
+        TypeParameterScope(
+          nameScope,
+          element.typeParameters.map((e) => e.asElement2).toList(),
+        ),
+        element.parameters.map((e) => e.asElement2).toList(),
       );
       super.visitFunctionExpression(node);
     } finally {
@@ -4967,7 +4973,10 @@
     Scope outerScope = nameScope;
     try {
       var element = node.declaredElement!;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.returnType?.accept(this);
       node.typeParameters?.accept(this);
       node.parameters.accept(this);
@@ -4988,7 +4997,7 @@
       ParameterElement element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       _visitDocumentationComment(node.documentationComment);
       node.returnType?.accept(this);
@@ -5012,7 +5021,10 @@
     Scope outerScope = nameScope;
     try {
       GenericFunctionTypeElement element = node.declaredElement!;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       super.visitGenericFunctionType(node);
     } finally {
@@ -5026,7 +5038,10 @@
     Scope outerScope = nameScope;
     try {
       var element = node.declaredElement as TypeAliasElement;
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.type.accept(this);
@@ -5034,8 +5049,12 @@
       var aliasedElement = element.aliasedElement;
       if (aliasedElement is GenericFunctionTypeElement) {
         nameScope = FormalParameterScope(
-            TypeParameterScope(nameScope, aliasedElement.typeParameters),
-            aliasedElement.parameters);
+          TypeParameterScope(
+            nameScope,
+            aliasedElement.typeParameters.map((e) => e.asElement2).toList(),
+          ),
+          aliasedElement.parameters.map((e) => e.asElement2).toList(),
+        );
       }
       _visitDocumentationComment(node.documentationComment);
     } finally {
@@ -5047,7 +5066,7 @@
   void visitGuardedPattern(covariant GuardedPatternImpl node) {
     var patternVariables = node.variables.values.toList();
     for (var variable in patternVariables) {
-      _define(variable.asElement!);
+      _define(variable);
     }
 
     node.pattern.accept(this);
@@ -5112,7 +5131,7 @@
       var element = node.declaredElement!;
       nameScope = TypeParameterScope(
         nameScope,
-        element.typeParameters,
+        element.typeParameters.map((e) => e.asElement2).toList(),
       );
       node.nameScope = nameScope;
       node.returnType?.accept(this);
@@ -5148,13 +5167,16 @@
       var element = node.declaredElement!;
       node.metadata.accept(this);
 
-      nameScope = TypeParameterScope(nameScope, element.typeParameters);
+      nameScope = TypeParameterScope(
+        nameScope,
+        element.typeParameters.map((e) => e.asElement2).toList(),
+      );
       node.nameScope = nameScope;
       node.typeParameters?.accept(this);
       node.onClause?.accept(this);
       node.implementsClause?.accept(this);
 
-      nameScope = InstanceScope(nameScope, element);
+      nameScope = InstanceScope(nameScope, element.asElement2);
       _visitDocumentationComment(node.documentationComment);
       node.members.accept(this);
     } finally {
@@ -5175,7 +5197,7 @@
     covariant PatternVariableDeclarationImpl node,
   ) {
     for (var variable in node.elements) {
-      _define(variable);
+      _define(variable.asElement2);
     }
 
     super.visitPatternVariableDeclaration(node);
@@ -5269,7 +5291,7 @@
         var guardedPattern = case_.guardedPattern;
         var variables = guardedPattern.variables;
         for (var variable in variables.values) {
-          _define(variable.asElement!);
+          _define(variable);
         }
         case_.accept(this);
       });
@@ -5307,7 +5329,7 @@
         var lastMember = group.members.last;
         _withDeclaredLocals(lastMember, lastMember.statements, () {
           for (var variable in group.variables.values) {
-            _define(variable.asElement!);
+            _define(variable);
           }
           lastMember.statements.accept(this);
         });
@@ -5331,7 +5353,7 @@
     super.visitVariableDeclaration(node);
 
     if (node.parent!.parent is ForParts) {
-      _define(node.declaredElement!);
+      _define(node.declaredElement!.asElement2!);
     }
   }
 
@@ -5361,7 +5383,7 @@
     return outerScope;
   }
 
-  void _define(Element element) {
+  void _define(Element2 element) {
     (nameScope as LocalScope).add(element);
   }
 
@@ -5490,7 +5512,7 @@
       var enclosedScope = LocalScope(nameScope);
       for (var statement in BlockScope.elementsInStatements(statements)) {
         if (!statement.isWildcardFunction) {
-          enclosedScope.add(statement);
+          enclosedScope.add(statement.asElement2!);
         }
       }
 
diff --git a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
index 54f5c68..0085189 100644
--- a/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/constructor_initializer_resolver.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/src/summary2/library_builder.dart';
 import 'package:analyzer/src/summary2/link.dart';
 import 'package:analyzer/src/summary2/linking_node_scope.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 class ConstructorInitializerResolver {
   final Linker _linker;
@@ -51,7 +52,7 @@
     var functionScope = LinkingNodeContext.get(node).scope;
     var initializerScope = ConstructorInitializerScope(
       functionScope,
-      element,
+      element.asElement2,
     );
 
     var analysisOptions = _libraryBuilder.kind.file.analysisOptions;
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 1e2bb09..c83c051 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -7,6 +7,7 @@
 import 'dart:collection';
 
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/element2.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
@@ -15,6 +16,7 @@
 import 'package:analyzer/src/summary2/bundle_reader.dart';
 import 'package:analyzer/src/summary2/export.dart';
 import 'package:analyzer/src/summary2/reference.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer/src/utilities/uri_cache.dart';
 import 'package:meta/meta.dart';
 
@@ -204,6 +206,11 @@
     return element;
   }
 
+  // TODO(scheglov): Why would this method return `null`?
+  Element2? elementOfReference2(Reference reference) {
+    return elementOfReference(reference)?.asElement2;
+  }
+
   bool hasLibrary(Uri uri) {
     // We already have the element, linked or read.
     if (rootReference['$uri']?.element is LibraryElementImpl) {
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index 5a07301..980aee2 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -20,6 +20,7 @@
 import 'package:analyzer/src/summary2/named_type_builder.dart';
 import 'package:analyzer/src/summary2/record_type_builder.dart';
 import 'package:analyzer/src/summary2/types_builder.dart';
+import 'package:analyzer/src/utilities/extensions/element.dart';
 
 /// Recursive visitor of LinkedNodes that resolves explicit type annotations
 /// in outlines.  This includes resolving element references in identifiers
@@ -75,7 +76,10 @@
 
     var element = node.declaredElement as ClassElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
@@ -83,7 +87,7 @@
     node.withClause?.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -98,7 +102,10 @@
 
     var element = node.declaredElement as ClassElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -123,7 +130,10 @@
 
     var element = node.declaredElement as ConstructorElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -143,14 +153,17 @@
 
     var element = node.declaredElement as EnumElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.implementsClause?.accept(this);
     node.withClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -173,13 +186,16 @@
 
     var element = node.declaredElement as ExtensionElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
 
-    scope = ExtensionScope(scope, element);
+    scope = ExtensionScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -199,14 +215,17 @@
 
     var element = node.declaredElement as ExtensionTypeElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.representation.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
     LinkingNodeContext(node.representation, scope);
 
@@ -228,7 +247,10 @@
 
     var element = node.declaredElement as FieldFormalParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.type?.accept(this);
     node.typeParameters?.accept(this);
@@ -249,7 +271,10 @@
 
     var element = node.declaredElement as ExecutableElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -272,7 +297,10 @@
 
     var element = node.declaredElement as TypeAliasElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -289,7 +317,10 @@
 
     var element = node.declaredElement as ParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -305,7 +336,10 @@
     var outerScope = scope;
 
     var element = node.declaredElement as GenericFunctionTypeElementImpl;
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.returnType?.accept(this);
     node.typeParameters?.accept(this);
@@ -326,7 +360,10 @@
 
     var element = node.declaredElement as TypeAliasElementImpl;
 
-    scope = TypeParameterScope(outerScope, element.typeParameters);
+    scope = TypeParameterScope(
+      outerScope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
@@ -354,7 +391,10 @@
 
     var element = node.declaredElement as ExecutableElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
     LinkingNodeContext(node, scope);
 
     node.metadata.accept(this);
@@ -372,14 +412,17 @@
 
     var element = node.declaredElement as MixinElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.metadata.accept(this);
     node.typeParameters?.accept(this);
     node.onClause?.accept(this);
     node.implementsClause?.accept(this);
 
-    scope = InstanceScope(scope, element);
+    scope = InstanceScope(scope, element.asElement2);
     LinkingNodeContext(node, scope);
 
     node.members.accept(this);
@@ -490,7 +533,10 @@
 
     var element = node.declaredElement as SuperFormalParameterElementImpl;
 
-    scope = TypeParameterScope(scope, element.typeParameters);
+    scope = TypeParameterScope(
+      scope,
+      element.typeParameters.map((e) => e.asElement2).toList(),
+    );
 
     node.type?.accept(this);
     node.typeParameters?.accept(this);
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 3367048..aa81e91 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -14,6 +14,20 @@
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:meta/meta.dart';
 
+extension BindPatternVariableElementImpl2Extension
+    on BindPatternVariableElementImpl2 {
+  BindPatternVariableElementImpl get asElement {
+    return firstFragment;
+  }
+}
+
+extension BindPatternVariableElementImplExtension
+    on BindPatternVariableElementImpl {
+  BindPatternVariableElementImpl2 get asElement2 {
+    return element;
+  }
+}
+
 extension ClassElement2Extension on ClassElement2 {
   ClassElement get asElement {
     return firstFragment as ClassElement;
@@ -146,6 +160,8 @@
     switch (self) {
       case null:
         return null;
+      case BindPatternVariableElementImpl2 element2:
+        return element2.asElement;
       case ConstructorElementImpl2 element2:
         return element2.asElement;
       case DynamicElementImpl2():
@@ -511,6 +527,12 @@
   }
 }
 
+extension MixinElementImplExtension on MixinElementImpl {
+  MixinElementImpl2 get asElement2 {
+    return element;
+  }
+}
+
 extension ParameterElementExtension on ParameterElement {
   FormalParameterElementMixin get asElement2 {
     return switch (this) {
