diff --git a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
index 1e03d65..dacab35 100644
--- a/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
+++ b/pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart
@@ -2,11 +2,14 @@
 // 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:front_end/src/api_unstable/dart2js.dart' as api;
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/type_environment.dart';
 
+import '../js_interop.dart' show getJSName;
+
 /// Replaces js_util methods with inline calls to foreign_helper JS which
 /// emits the code as a JavaScript code fragment.
 class JsUtilOptimizer extends Transformer {
@@ -82,6 +85,79 @@
     return node;
   }
 
+  @override
+  visitProcedure(Procedure node) {
+    _staticTypeContext.enterMember(node);
+    // Getters, setters, and fields declared as `static` will be skipped,
+    // because they do not have a node.kind of ProcedureKind.Method.
+    if (node.isExternal &&
+        node.isExtensionMember &&
+        node.kind == ProcedureKind.Method) {
+      var transformedBody;
+      if (api.getExtensionMemberKind(node) == ProcedureKind.Getter) {
+        transformedBody = _getExternalGetterBody(node);
+      } else if (api.getExtensionMemberKind(node) == ProcedureKind.Setter) {
+        transformedBody = _getExternalSetterBody(node);
+      }
+      // TODO(rileyporter): Add transformation for external extension methods,
+      // static members, and any operators we decide to support.
+      if (transformedBody != null) {
+        node.function.body = transformedBody;
+        node.isExternal = false;
+      }
+    } else {
+      node.transformChildren(this);
+    }
+    _staticTypeContext.leaveMember(node);
+    return node;
+  }
+
+  /// Returns a new function body for the given [node] external getter.
+  ///
+  /// The new function body will call the optimized version of
+  /// `js_util.getProperty` for the given external getter.
+  ReturnStatement _getExternalGetterBody(Procedure node) {
+    var function = node.function;
+    assert(function.positionalParameters.length == 1);
+    var getPropertyInvocation = StaticInvocation(
+        _getPropertyTarget,
+        Arguments([
+          VariableGet(function.positionalParameters.first),
+          StringLiteral(_getMemberName(node))
+        ]))
+      ..fileOffset = node.fileOffset;
+    return ReturnStatement(AsExpression(
+        _lowerGetProperty(getPropertyInvocation), function.returnType));
+  }
+
+  /// Returns a new function body for the given [node] external setter.
+  ///
+  /// The new function body will call the optimized version of
+  /// `js_util.setProperty` for the given external setter.
+  ReturnStatement _getExternalSetterBody(Procedure node) {
+    var function = node.function;
+    assert(function.positionalParameters.length == 2);
+    var setPropertyInvocation = StaticInvocation(
+        _setPropertyTarget,
+        Arguments([
+          VariableGet(function.positionalParameters.first),
+          StringLiteral(_getMemberName(node)),
+          VariableGet(function.positionalParameters.last)
+        ]))
+      ..fileOffset = node.fileOffset;
+    return ReturnStatement(AsExpression(
+        _lowerSetProperty(setPropertyInvocation), function.returnType));
+  }
+
+  /// Returns the member name, either from the `@JS` annotation if non-empty,
+  /// or parsed from CFE generated node name.
+  String _getMemberName(Procedure node) {
+    var jsAnnotationName = getJSName(node);
+    return jsAnnotationName.isNotEmpty
+        ? jsAnnotationName
+        : node.name.text.substring(node.name.text.indexOf('#') + 1);
+  }
+
   /// Replaces js_util method calls with optimization when possible.
   ///
   /// Lowers `getProperty` for any argument type straight to JS fragment call.
diff --git a/pkg/_js_interop_checks/pubspec.yaml b/pkg/_js_interop_checks/pubspec.yaml
index bae1992..27f50f2 100644
--- a/pkg/_js_interop_checks/pubspec.yaml
+++ b/pkg/_js_interop_checks/pubspec.yaml
@@ -8,5 +8,7 @@
 dependencies:
   _fe_analyzer_shared:
     path: ../_fe_analyzer_shared
+  front_end:
+    path: ../front_end
   kernel:
     path: ../kernel
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 4271825..44a2362 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -167,7 +167,7 @@
     Set<SemanticTokenModifiers>? semanticModifiers;
     var parent = node.parent;
     var grandParent = parent?.parent;
-    if (parent is TypeName &&
+    if (parent is NamedType &&
         grandParent is ConstructorName &&
         grandParent.parent is InstanceCreationExpression) {
       // new Class()
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 6cf3f1b..d51da04 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -31,7 +31,7 @@
     }
     var parent = node.parent;
     var grandParent = parent?.parent;
-    if (parent is TypeName &&
+    if (parent is NamedType &&
         grandParent is ConstructorName &&
         grandParent.parent is InstanceCreationExpression) {
       node = grandParent.parent;
diff --git a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
index 58aafe2..3c3d68b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_type_arguments_signature.dart
@@ -43,7 +43,7 @@
     }
     final parent = argumentList.parent;
     Element? element;
-    if (parent is TypeName) {
+    if (parent is NamedType) {
       element = ElementLocator.locate(parent.name);
     } else if (parent is MethodInvocation) {
       element = ElementLocator.locate(parent.methodName);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
index 18ebdde..975d96c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_member_contributor.dart
@@ -39,7 +39,7 @@
       PrefixElement elem,
       List<ImportElement> imports) {
     var parent = request.target.containingNode.parent;
-    var typesOnly = parent is TypeName;
+    var typesOnly = parent is NamedType;
     var isConstructor = parent?.parent is ConstructorName;
     for (var importElem in imports) {
       if (importElem.prefix?.name == elem.name) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 728ea51..b97e431 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -437,7 +437,7 @@
   bool _isUnused(String identifier) => RegExp(r'^_+$').hasMatch(identifier);
 
   bool _isVoid(TypeAnnotation? returnType) {
-    if (returnType is TypeName) {
+    if (returnType is NamedType) {
       var id = returnType.name;
       if (id.name == 'void') {
         return true;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
index a0cec5d..93a1727 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/named_constructor_contributor.dart
@@ -21,8 +21,8 @@
       if (libraryElement == null) {
         return;
       }
-      var typeName = node.type;
-      var type = typeName.type;
+      var namedType = node.type;
+      var type = namedType.type;
       if (type != null) {
         var element = type.element;
         if (element is ClassElement) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 6b96dcf..e67d203 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -129,9 +129,9 @@
   @override
   void declaredFunction(FunctionDeclaration declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -143,9 +143,9 @@
   @override
   void declaredFunctionTypeAlias(FunctionTypeAlias declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -157,9 +157,9 @@
   @override
   void declaredGenericTypeAlias(GenericTypeAlias declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.functionType?.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.functionType?.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
@@ -188,9 +188,9 @@
   @override
   void declaredMethod(MethodDeclaration declaration) {
     if (declaration.name.name == targetName) {
-      var typeName = declaration.returnType;
-      if (typeName != null) {
-        var type = typeName.type;
+      var returnType = declaration.returnType;
+      if (returnType != null) {
+        var type = returnType.type;
         if (type != null) {
           typeFound = type;
         }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index 26a1a94..d8d642e 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -29,7 +29,7 @@
 };
 
 /// A marker used in place of `null` when a function has no return type.
-final TypeName NO_RETURN_TYPE = astFactory.typeName(
+final NamedType NO_RETURN_TYPE = astFactory.typeName(
     astFactory.simpleIdentifier(StringToken(TokenType.IDENTIFIER, '', 0)),
     null);
 
@@ -246,7 +246,7 @@
 
   // If the type is unresolved, use the declared type.
   if (type.isDynamic) {
-    if (declaredType is TypeName) {
+    if (declaredType is NamedType) {
       return declaredType.name.name;
     }
     return DYNAMIC;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
index e2b1b0b..ba74ab0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/variable_name_contributor.dart
@@ -111,7 +111,7 @@
   }
 
   static Identifier? _typeAnnotationIdentifier(TypeAnnotation? type) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       return type.name;
     }
     return null;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
index a586ac4..56442ae 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/abstract_producer.dart
@@ -539,7 +539,7 @@
   bool mightBeTypeIdentifier(AstNode node) {
     if (node is SimpleIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName) {
+      if (parent is NamedType) {
         return true;
       }
       return _isNameOfType(node.name);
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
index 74c7d31..de6f8d5 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_const.dart
@@ -79,7 +79,7 @@
       await insertAtOffset(targetNode);
       return;
     }
-    if (targetNode is TypeName) {
+    if (targetNode is NamedType) {
       targetNode = targetNode.parent;
     }
     if (targetNode is ConstructorName) {
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
index 6c5b68c..af2fe16 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/add_diagnostic_property_reference.dart
@@ -165,7 +165,7 @@
         if (parameter is SimpleFormalParameter) {
           final type = parameter.type;
           final identifier = parameter.identifier;
-          if (type is TypeName && identifier != null) {
+          if (type is NamedType && identifier != null) {
             if (type.name.name == 'DiagnosticPropertiesBuilder') {
               propertiesBuilderName = identifier.name;
               break;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
index 0d0583d..2ec24e4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/change_to.dart
@@ -68,7 +68,7 @@
     // Prepare the optional import prefix name.
     String? prefixName;
     if (node is PrefixedIdentifier &&
-        node.parent is TypeName &&
+        node.parent is NamedType &&
         node.prefix.staticElement is PrefixElement) {
       prefixName = node.prefix.name;
       node = node.identifier;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
index dbc9020..b9934c4 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_mixin.dart
@@ -28,7 +28,7 @@
     if (node is SimpleIdentifier) {
       var parent = node.parent;
       var grandParent = parent?.parent;
-      if (parent is TypeName &&
+      if (parent is NamedType &&
           grandParent is ConstructorName &&
           grandParent.parent is InstanceCreationExpression) {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
index a3cd739..415f155 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/import_library.dart
@@ -143,7 +143,7 @@
     }
     if (node is PrefixedIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName) {
+      if (parent is NamedType) {
         return true;
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
index 6e71c21..d3089fb 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/inline_typedef.dart
@@ -151,7 +151,7 @@
 class _ReferenceFinder extends RecursiveAstVisitor {
   final String typeName;
 
-  TypeName? reference;
+  NamedType? reference;
 
   int count = 0;
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
index 0230ec5..82676c6 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/move_type_arguments_to_class.dart
@@ -27,17 +27,17 @@
       return;
     }
 
-    var typeName = creation.constructorName.type;
-    if (typeName.typeArguments != null) {
+    var namedType = creation.constructorName.type;
+    if (namedType.typeArguments != null) {
       return;
     }
 
-    var element = typeName.typeOrThrow.element;
+    var element = namedType.typeOrThrow.element;
     if (element is ClassElement &&
         element.typeParameters.length == typeArguments.arguments.length) {
       await builder.addDartFileEdit(file, (builder) {
         var argumentText = utils.getNodeText(typeArguments);
-        builder.addSimpleInsertion(typeName.end, argumentText);
+        builder.addSimpleInsertion(namedType.end, argumentText);
         builder.addDeletion(range.node(typeArguments));
       });
     }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart b/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
index 945b3b6..ff50a63 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/remove_question_mark.dart
@@ -33,7 +33,7 @@
         return;
       }
     }
-    if (targetNode is TypeName) {
+    if (targetNode is NamedType) {
       var questionMark = targetNode.question;
       if (questionMark == null) {
         return;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
index c19cf4a..fb29e4f 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_return_type_future.dart
@@ -15,13 +15,13 @@
   @override
   Future<void> compute(ChangeBuilder builder) async {
     // prepare the existing type
-    var typeName = node.thisOrAncestorOfType<TypeAnnotation>();
-    if (typeName == null) {
+    var typeAnnotation = node.thisOrAncestorOfType<TypeAnnotation>();
+    if (typeAnnotation == null) {
       return;
     }
 
     await builder.addDartFileEdit(file, (builder) {
-      builder.replaceTypeWithFuture(typeName, typeProvider);
+      builder.replaceTypeWithFuture(typeAnnotation, typeProvider);
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
index 860e620..176694e 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/replace_with_filled.dart
@@ -15,10 +15,10 @@
 
   @override
   Future<void> compute(ChangeBuilder builder) async {
-    var typeName = node is SimpleIdentifier ? node.parent : node;
-    var creation = typeName?.parent?.parent;
-    if (typeName is TypeName && creation is InstanceCreationExpression) {
-      var elementType = (typeName.type as InterfaceType).typeArguments[0];
+    var namedType = node is SimpleIdentifier ? node.parent : node;
+    var creation = namedType?.parent?.parent;
+    if (namedType is NamedType && creation is InstanceCreationExpression) {
+      var elementType = (namedType.type as InterfaceType).typeArguments[0];
       if (typeSystem.isNullable(elementType)) {
         var argumentList = creation.argumentList;
         if (argumentList.arguments.length == 1) {
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
index ce509a1..9599855 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/code_template.dart
@@ -100,7 +100,7 @@
         return parent.parent?.parent?.parent;
       } else if (parent is MethodInvocation && parent.methodName == node) {
         return parent;
-      } else if (parent is TypeName &&
+      } else if (parent is NamedType &&
           parent.parent is ConstructorName &&
           parent.parent?.parent is InstanceCreationExpression) {
         return parent.parent?.parent;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
index 097c93c..b3645cd 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/element_matcher.dart
@@ -127,7 +127,7 @@
         // don't represent parameters as elements, the element we need to match
         // against is the invocation containing those arguments.
         return _componentsFromParent(parent.parent!.parent!);
-      } else if (parent is TypeName && parent.parent is ConstructorName) {
+      } else if (parent is NamedType && parent.parent is ConstructorName) {
         return ['', node.name];
       } else if (parent is MethodDeclaration && node == parent.name) {
         return [node.name];
@@ -139,7 +139,7 @@
       return _componentsFromIdentifier(node);
     } else if (node is PrefixedIdentifier) {
       var parent = node.parent;
-      if (parent is TypeName && parent.parent is ConstructorName) {
+      if (parent is NamedType && parent.parent is ConstructorName) {
         return ['', node.identifier.name];
       }
       return [node.identifier.name];
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
index 56e83f4..c71ea13 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/modify_parameters.dart
@@ -244,7 +244,7 @@
     } else if (grandParent is InvocationExpression) {
       var argumentList = grandParent.argumentList;
       return _Data(argumentList);
-    } else if (parent is TypeName &&
+    } else if (parent is NamedType &&
         grandParent is ConstructorName &&
         greatGrandParent is InstanceCreationExpression) {
       var argumentList = greatGrandParent.argumentList;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
index d3089e9..104d268 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename.dart
@@ -48,7 +48,7 @@
           // named constructor.
           builder.addSimpleReplacement(range.node(nameNode), newName);
         }
-      } else if (parent is TypeName && parent.parent is ConstructorName) {
+      } else if (parent is NamedType && parent.parent is ConstructorName) {
         // The constructor was renamed from an unnamed constructor to a named
         // constructor.
         builder.addSimpleInsertion(parent.end, '.$newName');
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index f501ed0..93de681 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -181,8 +181,8 @@
     name = expression.methodName.name;
   } else if (expression is InstanceCreationExpression) {
     var constructorName = expression.constructorName;
-    var typeName = constructorName.type;
-    var typeNameIdentifier = typeName.name;
+    var namedType = constructorName.type;
+    var typeNameIdentifier = namedType.name;
     // new ClassName()
     if (typeNameIdentifier is SimpleIdentifier) {
       return typeNameIdentifier.name;
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index ced0ca3..b902a8b 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -558,7 +558,7 @@
     // return type
     //
     var returnType = node.returnType;
-    if (returnType is TypeName) {
+    if (returnType is NamedType) {
       _handleRefEdge(
         returnType.name.staticElement,
         const <String>[schema.REF_EDGE],
@@ -1235,7 +1235,7 @@
     addEdge(funcTypeVName, schema.PARAM_EDGE, fnBuiltin, ordinalIntValue: i++);
 
     KytheVName? returnTypeVName;
-    if (returnNode is TypeName) {
+    if (returnNode is NamedType) {
       // MethodDeclaration and FunctionDeclaration both return a TypeName from
       // returnType
       if (returnNode.typeOrThrow.isVoid) {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
index 7d361dc..4afc45f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_local.dart
@@ -281,7 +281,7 @@
           node is TypeArgumentList) {
         continue;
       }
-      if (node is ConstructorName || node is Label || node is TypeName) {
+      if (node is ConstructorName || node is Label || node is NamedType) {
         singleExpression = null;
         coveringExpressionOffsets.clear();
         coveringExpressionLengths.clear();
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index cb513a3..b733540 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -558,7 +558,7 @@
     if (node == null) {
       return false;
     }
-    if (node.parent is TypeName || node.parent?.parent is TypeName) {
+    if (node.parent is NamedType || node.parent?.parent is NamedType) {
       return false;
     }
     if (node.parent is ConstructorName) {
diff --git a/pkg/analysis_server/test/src/utilities/flutter_test.dart b/pkg/analysis_server/test/src/utilities/flutter_test.dart
index 4b35f0a..d616586 100644
--- a/pkg/analysis_server/test/src/utilities/flutter_test.dart
+++ b/pkg/analysis_server/test/src/utilities/flutter_test.dart
@@ -125,11 +125,11 @@
       var statement = statements[0] as ExpressionStatement;
       var creation = statement.expression as InstanceCreationExpression;
       var constructorName = creation.constructorName;
-      var typeName = constructorName.type;
+      var namedType = constructorName.type;
       var argumentList = creation.argumentList;
       expect(_flutter.identifyWidgetExpression(creation), creation);
       expect(_flutter.identifyWidgetExpression(constructorName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName), creation);
+      expect(_flutter.identifyWidgetExpression(namedType), creation);
       expect(_flutter.identifyWidgetExpression(argumentList), isNull);
       expect(
         _flutter.identifyWidgetExpression(argumentList.arguments[0]),
@@ -142,12 +142,12 @@
       var statement = statements[1] as ExpressionStatement;
       var creation = statement.expression as InstanceCreationExpression;
       var constructorName = creation.constructorName;
-      var typeName = constructorName.type;
+      var namedType = constructorName.type;
       var argumentList = creation.argumentList;
       expect(_flutter.identifyWidgetExpression(creation), creation);
       expect(_flutter.identifyWidgetExpression(constructorName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName), creation);
-      expect(_flutter.identifyWidgetExpression(typeName.name), creation);
+      expect(_flutter.identifyWidgetExpression(namedType), creation);
+      expect(_flutter.identifyWidgetExpression(namedType.name), creation);
       expect(_flutter.identifyWidgetExpression(constructorName.name), creation);
       expect(_flutter.identifyWidgetExpression(argumentList), isNull);
       expect(
diff --git a/pkg/analysis_server/tool/code_completion/completion_metrics.dart b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
index 59a0623..4522ce8 100644
--- a/pkg/analysis_server/tool/code_completion/completion_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/completion_metrics.dart
@@ -1791,7 +1791,7 @@
           return CompletionGroup.mixinElement;
         }
         if (entity is SimpleIdentifier &&
-            entity.parent is TypeName &&
+            entity.parent is NamedType &&
             entity.parent!.parent is ConstructorName &&
             entity.parent!.parent!.parent is InstanceCreationExpression) {
           return CompletionGroup.constructorElement;
diff --git a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
index 8a24e94..aa88b80 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_metrics.dart
@@ -845,8 +845,8 @@
   @override
   void visitImplementsClause(ImplementsClause node) {
     // At the start of each type name.
-    for (var typeName in node.interfaces) {
-      _recordDataForNode('ImplementsClause (type)', typeName);
+    for (var namedType in node.interfaces) {
+      _recordDataForNode('ImplementsClause (type)', namedType);
     }
     super.visitImplementsClause(node);
   }
@@ -1351,8 +1351,8 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (var typeName in node.mixinTypes) {
-      _recordDataForNode('WithClause (type)', typeName);
+    for (var namedType in node.mixinTypes) {
+      _recordDataForNode('WithClause (type)', namedType);
     }
     super.visitWithClause(node);
   }
diff --git a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
index 3e2af94..9e8f224 100644
--- a/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
+++ b/pkg/analysis_server/tool/code_completion/relevance_table_generator.dart
@@ -819,8 +819,8 @@
   @override
   void visitImplementsClause(ImplementsClause node) {
     // At the start of each type name.
-    for (var typeName in node.interfaces) {
-      _recordDataForNode('ImplementsClause_interface', typeName);
+    for (var namedType in node.interfaces) {
+      _recordDataForNode('ImplementsClause_interface', namedType);
     }
     super.visitImplementsClause(node);
   }
@@ -1251,8 +1251,8 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (var typeName in node.mixinTypes) {
-      _recordDataForNode('WithClause_mixinType', typeName);
+    for (var namedType in node.mixinTypes) {
+      _recordDataForNode('WithClause_mixinType', namedType);
     }
     super.visitWithClause(node);
   }
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 7dc28ed..c8ea01f 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -149,7 +149,7 @@
       TypeParameterList? typeParameters,
       Token equals,
       Token? abstractKeyword,
-      TypeName superclass,
+      NamedType superclass,
       WithClause withClause,
       ImplementsClause? implementsClause,
       Token semicolon);
@@ -230,7 +230,7 @@
   /// Returns a newly created constructor name. The [period] and [name] can be
   /// `null` if the constructor being named is the unnamed constructor.
   ConstructorName constructorName(
-      TypeName type, Token? period, SimpleIdentifier? name);
+      NamedType type, Token? period, SimpleIdentifier? name);
 
   /// Returns a newly created constructor reference.
   ConstructorReference constructorReference(
@@ -344,7 +344,7 @@
       Expression expression, Token? semicolon);
 
   /// Returns a newly created extends clause.
-  ExtendsClause extendsClause(Token extendsKeyword, TypeName superclass);
+  ExtendsClause extendsClause(Token extendsKeyword, NamedType superclass);
 
   /// Return a newly created extension declaration. The list of [typeParameters]
   /// can be `null` if there are no type parameters.
@@ -578,7 +578,7 @@
 
   /// Returns a newly created implements clause.
   ImplementsClause implementsClause(
-      Token implementsKeyword, List<TypeName> interfaces);
+      Token implementsKeyword, List<NamedType> interfaces);
 
   /// Returns a newly created import directive. Either or both of the
   /// [comment] and [metadata] can be `null` if the function does not have the
@@ -712,6 +712,15 @@
   /// Returns a newly created named expression.
   NamedExpression namedExpression(Label name, Expression expression);
 
+  /// Returns a newly created named type. The [typeArguments] can be `null` if
+  /// there are no type arguments. The [question] can be `null` if there is no
+  /// question mark.
+  NamedType namedType({
+    required Identifier name,
+    TypeArgumentList? typeArguments,
+    Token? question,
+  });
+
   /// Returns a newly created native clause.
   NativeClause nativeClause(Token nativeKeyword, StringLiteral? name);
 
@@ -728,7 +737,7 @@
   NullLiteral nullLiteral(Token literal);
 
   /// Return a newly created on clause.
-  OnClause onClause(Token onKeyword, List<TypeName> superclassConstraints);
+  OnClause onClause(Token onKeyword, List<NamedType> superclassConstraints);
 
   /// Returns a newly created parenthesized expression.
   ParenthesizedExpression parenthesizedExpression(
@@ -904,7 +913,7 @@
       Token leftBracket, List<TypeAnnotation> arguments, Token rightBracket);
 
   /// Returns a newly created type literal.
-  TypeLiteral typeLiteral({required TypeName typeName});
+  TypeLiteral typeLiteral({required NamedType typeName});
 
   /// Returns a newly created type name. The [typeArguments] can be `null` if
   /// there are no type arguments. The [question] can be `null` if there is no
@@ -962,7 +971,7 @@
       Expression condition, Token rightParenthesis, Statement body);
 
   /// Returns a newly created with clause.
-  WithClause withClause(Token withKeyword, List<TypeName> mixinTypes);
+  WithClause withClause(Token withKeyword, List<NamedType> mixinTypes);
 
   /// Returns a newly created yield expression. The [star] can be `null` if no
   /// star was provided.
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
index 9147be7..848cf02 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/library_builder.dart
@@ -169,7 +169,7 @@
   void _addClassOrMixin(ClassOrMixinDeclaration node) {
     var enclosingClassName = node.name.name;
 
-    TypeName? enclosingSuperClass;
+    NamedType? enclosingSuperClass;
     if (node is ClassDeclaration) {
       enclosingSuperClass = node.extendsClause?.superclass;
     }
@@ -303,7 +303,7 @@
 
   void _addConstructor(
     Node enclosingClass,
-    TypeName? enclosingSuperClass,
+    NamedType? enclosingSuperClass,
     List<Node> classMembers,
     ConstructorDeclaration node,
   ) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
index fe3dce6..88b61ee 100644
--- a/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/dependency/reference_collector.dart
@@ -56,7 +56,7 @@
       {String? enclosingClassName,
       String? thisNodeName,
       List<ConstructorInitializer>? constructorInitializers,
-      TypeName? enclosingSuperClass,
+      NamedType? enclosingSuperClass,
       Expression? expression,
       ExtendsClause? extendsClause,
       FormalParameterList? formalParameters,
@@ -66,7 +66,7 @@
       OnClause? onClause,
       ConstructorName? redirectedConstructor,
       TypeAnnotation? returnType,
-      TypeName? superClass,
+      NamedType? superClass,
       TypeAnnotation? type,
       TypeParameterList? typeParameters,
       TypeParameterList? typeParameters2,
@@ -264,7 +264,7 @@
   }
 
   /// Record reference to the constructor of the [type] with the given [name].
-  void _visitConstructor(TypeName type, SimpleIdentifier? name) {
+  void _visitConstructor(NamedType type, SimpleIdentifier? name) {
     _visitTypeAnnotation(type);
 
     if (name != null) {
@@ -275,7 +275,7 @@
   }
 
   void _visitConstructorInitializers(
-      TypeName? superClass, List<ConstructorInitializer>? initializers) {
+      NamedType? superClass, List<ConstructorInitializer>? initializers) {
     if (initializers == null) return;
 
     for (var i = 0; i < initializers.length; i++) {
@@ -805,7 +805,7 @@
       _visitFormalParameterList(node.parameters);
 
       _localScopes.exit();
-    } else if (node is TypeName) {
+    } else if (node is NamedType) {
       var identifier = node.name;
       _visitExpression(identifier);
       _visitTypeArguments(node.typeArguments);
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 26da055..90b8d68 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -522,9 +522,9 @@
     recordRelationOffset(element, kind, token.offset, token.length, true);
   }
 
-  /// Record a relation between a super [typeName] and its [Element].
-  void recordSuperType(TypeName typeName, IndexRelationKind kind) {
-    Identifier name = typeName.name;
+  /// Record a relation between a super [namedType] and its [Element].
+  void recordSuperType(NamedType namedType, IndexRelationKind kind) {
+    Identifier name = namedType.name;
     Element? element = name.staticElement;
     bool isQualified;
     SimpleIdentifier relNode;
@@ -538,7 +538,7 @@
     recordRelation(element, kind, relNode, isQualified);
     recordRelation(
         element, IndexRelationKind.IS_REFERENCED_BY, relNode, isQualified);
-    typeName.typeArguments?.accept(this);
+    namedType.typeArguments?.accept(this);
   }
 
   void recordUriReference(Element? element, StringLiteral uri) {
@@ -660,8 +660,8 @@
 
   @override
   void visitImplementsClause(ImplementsClause node) {
-    for (TypeName typeName in node.interfaces) {
-      recordSuperType(typeName, IndexRelationKind.IS_IMPLEMENTED_BY);
+    for (NamedType namedType in node.interfaces) {
+      recordSuperType(namedType, IndexRelationKind.IS_IMPLEMENTED_BY);
     }
   }
 
@@ -713,8 +713,8 @@
 
   @override
   void visitOnClause(OnClause node) {
-    for (TypeName typeName in node.superclassConstraints) {
-      recordSuperType(typeName, IndexRelationKind.IS_IMPLEMENTED_BY);
+    for (NamedType namedType in node.superclassConstraints) {
+      recordSuperType(namedType, IndexRelationKind.IS_IMPLEMENTED_BY);
     }
   }
 
@@ -830,14 +830,14 @@
 
   @override
   void visitWithClause(WithClause node) {
-    for (TypeName typeName in node.mixinTypes) {
-      recordSuperType(typeName, IndexRelationKind.IS_MIXED_IN_BY);
+    for (NamedType namedType in node.mixinTypes) {
+      recordSuperType(namedType, IndexRelationKind.IS_MIXED_IN_BY);
     }
   }
 
   /// Record the given class as a subclass of its direct superclasses.
   void _addSubtype(String name,
-      {TypeName? superclass,
+      {NamedType? superclass,
       WithClause? withClause,
       OnClause? onClause,
       ImplementsClause? implementsClause,
@@ -853,7 +853,7 @@
           element.name;
     }
 
-    void addSupertype(TypeName? type) {
+    void addSupertype(NamedType? type) {
       var element = type?.name.staticElement;
       if (element is ClassElement) {
         String id = getClassElementId(element);
diff --git a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
index 2461021..073d6f6 100644
--- a/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/referenced_names.dart
@@ -17,7 +17,7 @@
 Set<String> computeSubtypedNames(CompilationUnit unit) {
   Set<String> subtypedNames = <String>{};
 
-  void _addSubtypedName(TypeName? type) {
+  void _addSubtypedName(NamedType? type) {
     if (type != null) {
       Identifier name = type.name;
       if (name is SimpleIdentifier) {
@@ -28,7 +28,7 @@
     }
   }
 
-  void _addSubtypedNames(List<TypeName>? types) {
+  void _addSubtypedNames(List<NamedType>? types) {
     types?.forEach(_addSubtypedName);
   }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index a8b5cae..bdcb763 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -5759,8 +5759,8 @@
   final NodeListImpl<TypeName> _interfaces = NodeListImpl._();
 
   /// Initialize a newly created implements clause.
-  ImplementsClauseImpl(this.implementsKeyword, List<TypeName> interfaces) {
-    _interfaces._initialize(this, interfaces);
+  ImplementsClauseImpl(this.implementsKeyword, List<NamedType> interfaces) {
+    _interfaces._initialize2(this, interfaces);
   }
 
   @override
@@ -7635,6 +7635,20 @@
       }
     }
   }
+
+  /// Set the [owner] of this container, and populate it with [elements].
+  /// TODO(scheglov) Remove this method, it exists only to implicitly cast.
+  void _initialize2<E2>(AstNodeImpl owner, List<E2>? elements) {
+    _owner = owner;
+    if (elements != null) {
+      var length = elements.length;
+      for (var i = 0; i < length; i++) {
+        var node = elements[i] as E;
+        _elements.add(node);
+        owner._becomeParentOf(node as AstNodeImpl);
+      }
+    }
+  }
 }
 
 /// A formal parameter that is required (is not optional).
@@ -7825,8 +7839,8 @@
   final NodeListImpl<TypeName> _superclassConstraints = NodeListImpl._();
 
   /// Initialize a newly created on clause.
-  OnClauseImpl(this.onKeyword, List<TypeName> superclassConstraints) {
-    _superclassConstraints._initialize(this, superclassConstraints);
+  OnClauseImpl(this.onKeyword, List<NamedType> superclassConstraints) {
+    _superclassConstraints._initialize2(this, superclassConstraints);
   }
 
   @override
@@ -10866,8 +10880,8 @@
   final NodeListImpl<TypeName> _mixinTypes = NodeListImpl._();
 
   /// Initialize a newly created with clause.
-  WithClauseImpl(this.withKeyword, List<TypeName> mixinTypes) {
-    _mixinTypes._initialize(this, mixinTypes);
+  WithClauseImpl(this.withKeyword, List<NamedType> mixinTypes) {
+    _mixinTypes._initialize2(this, mixinTypes);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index 0b36161..36ae79d 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -185,7 +185,7 @@
           TypeParameterList? typeParameters,
           Token equals,
           Token? abstractKeyword,
-          TypeName superclass,
+          NamedType superclass,
           WithClause withClause,
           ImplementsClause? implementsClause,
           Token semicolon) =>
@@ -296,7 +296,7 @@
 
   @override
   ConstructorNameImpl constructorName(
-          TypeName type, Token? period, SimpleIdentifier? name) =>
+          NamedType type, Token? period, SimpleIdentifier? name) =>
       ConstructorNameImpl(
           type as TypeNameImpl, period, name as SimpleIdentifierImpl?);
 
@@ -433,7 +433,7 @@
       ExpressionStatementImpl(expression as ExpressionImpl, semicolon);
 
   @override
-  ExtendsClauseImpl extendsClause(Token extendsKeyword, TypeName superclass) =>
+  ExtendsClauseImpl extendsClause(Token extendsKeyword, NamedType superclass) =>
       ExtendsClauseImpl(extendsKeyword, superclass as TypeNameImpl);
 
   @override
@@ -782,7 +782,7 @@
 
   @override
   ImplementsClauseImpl implementsClause(
-          Token implementsKeyword, List<TypeName> interfaces) =>
+          Token implementsKeyword, List<NamedType> interfaces) =>
       ImplementsClauseImpl(implementsKeyword, interfaces);
 
   @override
@@ -980,6 +980,16 @@
       NamedExpressionImpl(name as LabelImpl, expression as ExpressionImpl);
 
   @override
+  TypeNameImpl namedType({
+    required Identifier name,
+    TypeArgumentList? typeArguments,
+    Token? question,
+  }) =>
+      TypeNameImpl(
+          name as IdentifierImpl, typeArguments as TypeArgumentListImpl?,
+          question: question);
+
+  @override
   NativeClauseImpl nativeClause(Token nativeKeyword, StringLiteral? name) =>
       NativeClauseImpl(nativeKeyword, name as StringLiteralImpl?);
 
@@ -998,7 +1008,7 @@
 
   @override
   OnClauseImpl onClause(
-          Token onKeyword, List<TypeName> superclassConstraints) =>
+          Token onKeyword, List<NamedType> superclassConstraints) =>
       OnClauseImpl(onKeyword, superclassConstraints);
 
   @override
@@ -1231,7 +1241,7 @@
       TypeArgumentListImpl(leftBracket, arguments, rightBracket);
 
   @override
-  TypeLiteralImpl typeLiteral({required TypeName typeName}) =>
+  TypeLiteralImpl typeLiteral({required NamedType typeName}) =>
       TypeLiteralImpl(typeName as TypeNameImpl);
 
   @override
@@ -1316,7 +1326,7 @@
           condition as ExpressionImpl, rightParenthesis, body as StatementImpl);
 
   @override
-  WithClauseImpl withClause(Token withKeyword, List<TypeName> mixinTypes) =>
+  WithClauseImpl withClause(Token withKeyword, List<NamedType> mixinTypes) =>
       WithClauseImpl(withKeyword, mixinTypes);
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index fbfbc17..98d8a04 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -143,9 +143,9 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     if (node.isConst) {
-      TypeName typeName = node.constructorName.type;
+      NamedType namedType = node.constructorName.type;
       _checkForConstWithTypeParameters(
-          typeName, CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS);
+          namedType, CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS);
 
       node.argumentList.accept(this);
 
@@ -285,7 +285,7 @@
   /// See [CompileTimeErrorCode.CONST_WITH_TYPE_PARAMETERS].
   void _checkForConstWithTypeParameters(
       TypeAnnotation type, ErrorCode errorCode) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       Identifier name = type.name;
       // Should not be a type parameter.
       if (name.staticElement is TypeParameterElement) {
diff --git a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
index 62c8072..3b37d629 100644
--- a/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
+++ b/pkg/analyzer/lib/src/dart/constant/potentially_constant.dart
@@ -348,7 +348,7 @@
   /// Return `true` if the [node] is a constant type expression.
   bool check(TypeAnnotation? node) {
     if (potentially) {
-      if (node is TypeName) {
+      if (node is NamedType) {
         var element = node.name.staticElement;
         if (element is TypeParameterElement) {
           var enclosing = element.enclosingElement;
@@ -357,7 +357,7 @@
       }
     }
 
-    if (node is TypeName) {
+    if (node is NamedType) {
       if (_isConstantTypeName(node.name)) {
         var arguments = node.typeArguments?.arguments;
         if (arguments != null) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
index b24466b..14d554a 100644
--- a/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/prefixed_identifier_resolver.dart
@@ -63,7 +63,7 @@
       identifier.staticType = type;
       return;
     } else if (element is TypeAliasElement) {
-      if (node.parent is TypeName) {
+      if (node.parent is NamedType) {
         // no type
       } else {
         var type = _typeProvider.typeType;
@@ -129,7 +129,7 @@
         parent is MethodInvocation ||
         parent is PrefixedIdentifier && parent.prefix == node ||
         parent is PropertyAccess ||
-        parent is TypeName) {
+        parent is NamedType) {
       return false;
     }
     return true;
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 379b087..3275ca4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -1241,36 +1241,36 @@
     var redirectedConstructor = node.redirectedConstructor;
     if (redirectedConstructor == null) return;
 
-    var typeName = redirectedConstructor.type;
-    _typeNameResolver.redirectedConstructor_typeName = typeName;
+    var namedType = redirectedConstructor.type;
+    _typeNameResolver.redirectedConstructor_typeName = namedType;
 
     redirectedConstructor.accept(this);
 
     _typeNameResolver.redirectedConstructor_typeName = null;
   }
 
-  /// Return the [InterfaceType] of the given [typeName].
+  /// Return the [InterfaceType] of the given [namedType].
   ///
   /// If the resulting type is not a valid interface type, return `null`.
   ///
   /// The flag [asClass] specifies if the type will be used as a class, so mixin
   /// declarations are not valid (they declare interfaces and mixins, but not
   /// classes).
-  void _resolveType(TypeNameImpl typeName, ErrorCode errorCode,
+  void _resolveType(TypeNameImpl namedType, ErrorCode errorCode,
       {bool asClass = false}) {
-    _typeNameResolver.classHierarchy_typeName = typeName;
-    visitTypeName(typeName);
+    _typeNameResolver.classHierarchy_typeName = namedType;
+    visitTypeName(namedType);
     _typeNameResolver.classHierarchy_typeName = null;
 
     if (_typeNameResolver.hasErrorReported) {
       return;
     }
 
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin && asClass) {
-        _errorReporter.reportErrorForNode(errorCode, typeName);
+        _errorReporter.reportErrorForNode(errorCode, namedType);
         return;
       }
       return;
@@ -1278,7 +1278,7 @@
 
     // If the type is not an InterfaceType, then visitTypeName() sets the type
     // to be a DynamicTypeImpl
-    Identifier name = typeName.name;
+    Identifier name = namedType.name;
     if (!_libraryElement.shouldIgnoreUndefinedIdentifier(name)) {
       _errorReporter.reportErrorForNode(errorCode, name);
     }
@@ -1293,19 +1293,19 @@
   ///        be an enum
   /// @param dynamicTypeError the error to produce if the type name is "dynamic"
   /// @return an array containing all of the types that were resolved.
-  void _resolveTypes(NodeList<TypeName> typeNames, ErrorCode errorCode) {
-    for (var typeName in typeNames) {
-      _resolveType(typeName as TypeNameImpl, errorCode);
+  void _resolveTypes(NodeList<NamedType> namedTypes, ErrorCode errorCode) {
+    for (var namedType in namedTypes) {
+      _resolveType(namedType as TypeNameImpl, errorCode);
     }
   }
 
   void _resolveWithClause(WithClause? clause) {
     if (clause == null) return;
 
-    for (var typeName in clause.mixinTypes) {
-      _typeNameResolver.withClause_typeName = typeName;
+    for (var namedType in clause.mixinTypes) {
+      _typeNameResolver.withClause_typeName = namedType;
       _resolveType(
-        typeName as TypeNameImpl,
+        namedType as TypeNameImpl,
         CompileTimeErrorCode.MIXIN_OF_NON_CLASS,
       );
       _typeNameResolver.withClause_typeName = null;
diff --git a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
index 4c872f9..198ba56 100644
--- a/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/simple_identifier_resolver.dart
@@ -82,7 +82,7 @@
         parent is MethodInvocation ||
         parent is PrefixedIdentifier && parent.prefix == node ||
         parent is PropertyAccess ||
-        parent is TypeName) {
+        parent is NamedType) {
       return false;
     }
     return true;
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index e7ac1b0..fb503dd 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -813,7 +813,7 @@
 
     // `is dynamic` or `is! dynamic`
     if (rightType.isDynamic) {
-      var rightTypeStr = rightNode is TypeName ? rightNode.name.name : null;
+      var rightTypeStr = rightNode is NamedType ? rightNode.name.name : null;
       if (rightTypeStr == Keyword.DYNAMIC.lexeme) {
         report();
         return true;
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 696dfb6..928a9f5 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -100,7 +100,7 @@
   final List<ClassMember> members;
   final ImplementsClause? implementsClause;
   final OnClause? onClause;
-  final TypeName? superclass;
+  final NamedType? superclass;
   final WithClause? withClause;
 
   final List<InterfaceType> directSuperInterfaces = [];
@@ -318,10 +318,10 @@
     }
   }
 
-  /// Verify that the given [typeName] does not extend, implement, or mixes-in
+  /// Verify that the given [namedType] does not extend, implement, or mixes-in
   /// types such as `num` or `String`.
-  bool _checkDirectSuperType(TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+  bool _checkDirectSuperType(NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
 
@@ -331,10 +331,10 @@
       return false;
     }
 
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType &&
         typeProvider.isNonSubtypableClass(type.element)) {
-      reporter.reportErrorForNode(errorCode, typeName, [type]);
+      reporter.reportErrorForNode(errorCode, namedType, [type]);
       return true;
     }
 
@@ -347,9 +347,9 @@
   bool _checkDirectSuperTypes() {
     var hasError = false;
     if (implementsClause != null) {
-      for (var typeName in implementsClause!.interfaces) {
+      for (var namedType in implementsClause!.interfaces) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS,
         )) {
           hasError = true;
@@ -357,9 +357,9 @@
       }
     }
     if (onClause != null) {
-      for (var typeName in onClause!.superclassConstraints) {
+      for (var namedType in onClause!.superclassConstraints) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS,
         )) {
           hasError = true;
@@ -375,9 +375,9 @@
       }
     }
     if (withClause != null) {
-      for (var typeName in withClause!.mixinTypes) {
+      for (var namedType in withClause!.mixinTypes) {
         if (_checkDirectSuperType(
-          typeName,
+          namedType,
           CompileTimeErrorCode.MIXIN_OF_DISALLOWED_CLASS,
         )) {
           hasError = true;
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 71ab7b9..c6edd49 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -147,6 +147,15 @@
     _checkForImplicitDynamicInvoke(node);
   }
 
+  void checkNamedType(NamedType node) {
+    _checkForTypeArgumentNotMatchingBounds(node);
+    var parent = node.parent;
+    if (parent is! ConstructorName ||
+        parent.parent is! InstanceCreationExpression) {
+      _checkForRawTypeName(node);
+    }
+  }
+
   void checkSetLiteral(SetOrMapLiteral node) {
     var typeArguments = node.typeArguments;
     if (typeArguments != null) {
@@ -162,15 +171,6 @@
     _checkForImplicitDynamicTypedLiteral(node);
   }
 
-  void checkTypeName(TypeName node) {
-    _checkForTypeArgumentNotMatchingBounds(node);
-    var parent = node.parent;
-    if (parent is! ConstructorName ||
-        parent.parent is! InstanceCreationExpression) {
-      _checkForRawTypeName(node);
-    }
-  }
-
   void _checkForImplicitDynamicInvoke(InvocationExpression node) {
     if (_options.implicitDynamic || node.typeArguments != null) {
       return;
@@ -232,10 +232,10 @@
   /// This checks if [node] refers to a generic type and does not have explicit
   /// or inferred type arguments. When that happens, it reports error code
   /// [HintCode.STRICT_RAW_TYPE].
-  void _checkForRawTypeName(TypeName node) {
-    AstNode parentEscapingTypeArguments(TypeName node) {
+  void _checkForRawTypeName(NamedType node) {
+    AstNode parentEscapingTypeArguments(NamedType node) {
       var parent = node.parent!;
-      while (parent is TypeArgumentList || parent is TypeName) {
+      while (parent is TypeArgumentList || parent is NamedType) {
         if (parent.parent == null) {
           return parent;
         }
@@ -262,10 +262,10 @@
     }
   }
 
-  /// Verify that the type arguments in the given [typeName] are all within
+  /// Verify that the type arguments in the given [namedType] are all within
   /// their bounds.
-  void _checkForTypeArgumentNotMatchingBounds(TypeName typeName) {
-    var type = typeName.type;
+  void _checkForTypeArgumentNotMatchingBounds(NamedType namedType) {
+    var type = namedType.type;
     if (type == null) {
       return;
     }
@@ -298,7 +298,7 @@
         if (!_libraryElement.featureSet.isEnabled(Feature.generic_metadata)) {
           _errorReporter.reportErrorForNode(
             CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
-            _typeArgumentErrorNode(typeName, i),
+            _typeArgumentErrorNode(namedType, i),
           );
           continue;
         }
@@ -326,11 +326,11 @@
     }
 
     // If not allowed to be super-bounded, report issues.
-    if (!_shouldAllowSuperBoundedTypes(typeName)) {
+    if (!_shouldAllowSuperBoundedTypes(namedType)) {
       for (var issue in issues) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-          _typeArgumentErrorNode(typeName, issue.index),
+          _typeArgumentErrorNode(namedType, issue.index),
           [issue.argument, issue.parameter.name, issue.parameterBound],
         );
       }
@@ -365,7 +365,7 @@
       if (!_typeSystem.isSubtypeOf(typeArgument, bound)) {
         _errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
-          _typeArgumentErrorNode(typeName, i),
+          _typeArgumentErrorNode(namedType, i),
           [typeArgument, typeParameter.name, bound],
         );
       }
@@ -442,7 +442,7 @@
   void _checkTypeArgumentConst(
       NodeList<TypeAnnotation> arguments, ErrorCode errorCode) {
     for (TypeAnnotation type in arguments) {
-      if (type is TypeName && type.type is TypeParameterType) {
+      if (type is NamedType && type.type is TypeParameterType) {
         _errorReporter.reportErrorForNode(errorCode, type, [type.name]);
       }
     }
@@ -515,10 +515,10 @@
     return false;
   }
 
-  /// Determines if the given [typeName] occurs in a context where super-bounded
-  /// types are allowed.
-  bool _shouldAllowSuperBoundedTypes(TypeName typeName) {
-    var parent = typeName.parent;
+  /// Determines if the given [namedType] occurs in a context where
+  /// super-bounded types are allowed.
+  bool _shouldAllowSuperBoundedTypes(NamedType namedType) {
+    var parent = namedType.parent;
     if (parent is ExtendsClause) return false;
     if (parent is OnClause) return false;
     if (parent is ClassTypeAlias) return false;
@@ -530,7 +530,7 @@
   }
 
   /// Return the type arguments at [index] from [node], or the [node] itself.
-  static TypeAnnotation _typeArgumentErrorNode(TypeName node, int index) {
+  static TypeAnnotation _typeArgumentErrorNode(NamedType node, int index) {
     var typeArguments = node.typeArguments?.arguments;
     if (typeArguments != null && index < typeArguments.length) {
       return typeArguments[index];
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 8e7e1ae..0d64b24 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -252,7 +252,7 @@
       return;
     }
     // Ignore places where the element is not actually used.
-    if (node.parent is TypeName) {
+    if (node.parent is NamedType) {
       if (element is ClassElement) {
         AstNode parent2 = node.parent!.parent!;
         if (parent2 is IsExpression) {
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 73d7faf..6493ae6 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -868,23 +868,24 @@
   @override
   void visitInstanceCreationExpression(InstanceCreationExpression node) {
     ConstructorName constructorName = node.constructorName;
-    TypeName typeName = constructorName.type;
-    DartType type = typeName.typeOrThrow;
+    NamedType namedType = constructorName.type;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
-      _checkForConstOrNewWithAbstractClass(node, typeName, type);
-      _checkForConstOrNewWithEnum(node, typeName, type);
-      _checkForConstOrNewWithMixin(node, typeName, type);
+      _checkForConstOrNewWithAbstractClass(node, namedType, type);
+      _checkForConstOrNewWithEnum(node, namedType, type);
+      _checkForConstOrNewWithMixin(node, namedType, type);
       _requiredParametersVerifier.visitInstanceCreationExpression(node);
       if (node.isConst) {
         _checkForConstWithNonConst(node);
-        _checkForConstWithUndefinedConstructor(node, constructorName, typeName);
-        _checkForConstDeferredClass(node, constructorName, typeName);
+        _checkForConstWithUndefinedConstructor(
+            node, constructorName, namedType);
+        _checkForConstDeferredClass(node, constructorName, namedType);
       } else {
-        _checkForNewWithUndefinedConstructor(node, constructorName, typeName);
+        _checkForNewWithUndefinedConstructor(node, constructorName, namedType);
       }
       _checkForListConstructor(node, type);
     }
-    _checkForImplicitDynamicType(typeName);
+    _checkForImplicitDynamicType(namedType);
     super.visitInstanceCreationExpression(node);
   }
 
@@ -1218,7 +1219,7 @@
 
   @override
   void visitTypeName(TypeName node) {
-    _typeArgumentsVerifier.checkTypeName(node);
+    _typeArgumentsVerifier.checkNamedType(node);
     super.visitTypeName(node);
   }
 
@@ -1296,7 +1297,7 @@
   /// interfaces.
   void _checkClassInheritance(
       NamedCompilationUnitMember node,
-      TypeName? superclass,
+      NamedType? superclass,
       WithClause? withClause,
       ImplementsClause? implementsClause) {
     // Only check for all of the inheritance logic around clauses if there
@@ -1385,7 +1386,7 @@
     for (int mixinNameIndex = 0;
         mixinNameIndex < withClause.mixinTypes.length;
         mixinNameIndex++) {
-      TypeName mixinName = withClause.mixinTypes[mixinNameIndex];
+      NamedType mixinName = withClause.mixinTypes[mixinNameIndex];
       DartType mixinType = mixinName.typeOrThrow;
       if (mixinType is InterfaceType) {
         mixinTypeIndex++;
@@ -1435,11 +1436,11 @@
     if (redirectedElement == null) {
       // If the element is null, we check for the
       // REDIRECT_TO_MISSING_CONSTRUCTOR case
-      TypeName constructorTypeName = redirectedConstructor.type;
-      DartType redirectedType = constructorTypeName.typeOrThrow;
+      NamedType constructorNamedType = redirectedConstructor.type;
+      DartType redirectedType = constructorNamedType.typeOrThrow;
       if (redirectedType.element != null && !redirectedType.isDynamic) {
         // Prepare the constructor name
-        String constructorStrName = constructorTypeName.name.name;
+        String constructorStrName = constructorNamedType.name.name;
         if (redirectedConstructor.name != null) {
           constructorStrName += ".${redirectedConstructor.name!.name}";
         }
@@ -1636,7 +1637,7 @@
     }
 
     if (withClause != null) {
-      for (TypeName type in withClause.mixinTypes) {
+      for (NamedType type in withClause.mixinTypes) {
         var mixinElement = type.name.staticElement;
         if (mixinElement != null && mixinElement.name == "Function") {
           errorReporter.reportErrorForNode(
@@ -1979,13 +1980,13 @@
 
   /// Verify that the given 'const' instance creation [expression] is not
   /// creating a deferred type. The [constructorName] is the constructor name,
-  /// always non-`null`. The [typeName] is the name of the type defining the
+  /// always non-`null`. The [namedType] is the name of the type defining the
   /// constructor, always non-`null`.
   ///
   /// See [CompileTimeErrorCode.CONST_DEFERRED_CLASS].
   void _checkForConstDeferredClass(InstanceCreationExpression expression,
-      ConstructorName constructorName, TypeName typeName) {
-    if (typeName.isDeferred) {
+      ConstructorName constructorName, NamedType namedType) {
+    if (namedType.isDeferred) {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName);
     }
@@ -2003,13 +2004,13 @@
   }
 
   /// Verify that the given instance creation [expression] is not being invoked
-  /// on an abstract class. The [typeName] is the [TypeName] of the
+  /// on an abstract class. The [namedType] is the [NamedType] of the
   /// [ConstructorName] from the [InstanceCreationExpression], this is the AST
   /// node that the error is attached to. The [type] is the type being
   /// constructed with this [InstanceCreationExpression].
   void _checkForConstOrNewWithAbstractClass(
       InstanceCreationExpression expression,
-      TypeName typeName,
+      NamedType namedType,
       InterfaceType type) {
     if (type.element.isAbstract && !type.element.isMixin) {
       var element = expression.constructorName.staticElement;
@@ -2018,36 +2019,36 @@
             (expression as InstanceCreationExpressionImpl).isImplicit;
         if (!isImplicit) {
           errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, typeName);
+              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, namedType);
         } else {
           errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, typeName);
+              CompileTimeErrorCode.INSTANTIATE_ABSTRACT_CLASS, namedType);
         }
       }
     }
   }
 
   /// Verify that the given instance creation [expression] is not being invoked
-  /// on an enum. The [typeName] is the [TypeName] of the [ConstructorName] from
+  /// on an enum. The [namedType] is the [NamedType] of the [ConstructorName] from
   /// the [InstanceCreationExpression], this is the AST node that the error is
   /// attached to. The [type] is the type being constructed with this
   /// [InstanceCreationExpression].
   ///
   /// See [CompileTimeErrorCode.INSTANTIATE_ENUM].
   void _checkForConstOrNewWithEnum(InstanceCreationExpression expression,
-      TypeName typeName, InterfaceType type) {
+      NamedType namedType, InterfaceType type) {
     if (type.element.isEnum) {
       errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.INSTANTIATE_ENUM, typeName);
+          CompileTimeErrorCode.INSTANTIATE_ENUM, namedType);
     }
   }
 
   /// Verify that the given [expression] is not a mixin instantiation.
   void _checkForConstOrNewWithMixin(InstanceCreationExpression expression,
-      TypeName typeName, InterfaceType type) {
+      NamedType namedType, InterfaceType type) {
     if (type.element.isMixin) {
       errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.MIXIN_INSTANTIATE, typeName);
+          CompileTimeErrorCode.MIXIN_INSTANTIATE, namedType);
     }
   }
 
@@ -2073,7 +2074,7 @@
 
   /// Verify that if the given 'const' instance creation [expression] is being
   /// invoked on the resolved constructor. The [constructorName] is the
-  /// constructor name, always non-`null`. The [typeName] is the name of the
+  /// constructor name, always non-`null`. The [namedType] is the name of the
   /// type defining the constructor, always non-`null`.
   ///
   /// This method assumes that the instance creation was tested to be 'const'
@@ -2084,12 +2085,12 @@
   void _checkForConstWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
-      TypeName typeName) {
+      NamedType namedType) {
     // OK if resolved
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum) {
@@ -2097,7 +2098,7 @@
         return;
       }
     }
-    Identifier className = typeName.name;
+    Identifier className = namedType.name;
     // report as named or default constructor absence
     var name = constructorName.name;
     if (name != null) {
@@ -2206,7 +2207,7 @@
     }
 
     // Use an explicit string instead of [loopType] to remove the "<E>".
-    String loopTypeName = awaitKeyword != null ? "Stream" : "Iterable";
+    String loopNamedType = awaitKeyword != null ? "Stream" : "Iterable";
 
     // The object being iterated has to implement Iterable<T> for some T that
     // is assignable to the variable's type.
@@ -2225,7 +2226,7 @@
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_TYPE,
         node.iterable,
-        [iterableType, loopTypeName],
+        [iterableType, loopNamedType],
       );
       return false;
     }
@@ -2249,7 +2250,7 @@
       errorReporter.reportErrorForNode(
         CompileTimeErrorCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
         node.iterable,
-        [iterableType, loopTypeName, variableType],
+        [iterableType, loopNamedType, variableType],
       );
     }
 
@@ -2322,7 +2323,7 @@
   /// Verify that the given extends [clause] does not extend a deferred class.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
-  void _checkForExtendsDeferredClass(TypeName? superclass) {
+  void _checkForExtendsDeferredClass(NamedType? superclass) {
     if (superclass == null) {
       return;
     }
@@ -2334,7 +2335,7 @@
   /// 'num' or 'String'.
   ///
   /// See [CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS].
-  bool _checkForExtendsDisallowedClass(TypeName? superclass) {
+  bool _checkForExtendsDisallowedClass(NamedType? superclass) {
     if (superclass == null) {
       return false;
     }
@@ -2342,7 +2343,7 @@
         superclass, CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS);
   }
 
-  /// Verify that the given [typeName] does not extend, implement or mixin
+  /// Verify that the given [namedType] does not extend, implement or mixin
   /// classes that are deferred.
   ///
   /// See [_checkForExtendsDeferredClass],
@@ -2353,18 +2354,18 @@
   /// [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS], and
   /// [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS].
   bool _checkForExtendsOrImplementsDeferredClass(
-      TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+      NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
-    if (typeName.isDeferred) {
-      errorReporter.reportErrorForNode(errorCode, typeName);
+    if (namedType.isDeferred) {
+      errorReporter.reportErrorForNode(errorCode, namedType);
       return true;
     }
     return false;
   }
 
-  /// Verify that the given [typeName] does not extend, implement or mixin
+  /// Verify that the given [namedType] does not extend, implement or mixin
   /// classes such as 'num' or 'String'.
   ///
   /// TODO(scheglov) Remove this method, when all inheritance / override
@@ -2372,8 +2373,8 @@
   /// inheritance is completely wrong, so that we don't need to check anything
   /// else.
   bool _checkForExtendsOrImplementsDisallowedClass(
-      TypeName typeName, ErrorCode errorCode) {
-    if (typeName.isSynthetic) {
+      NamedType namedType, ErrorCode errorCode) {
+    if (namedType.isSynthetic) {
       return false;
     }
     // The SDK implementation may implement disallowed types. For example,
@@ -2381,7 +2382,7 @@
     if (_currentLibrary.source.isInSystemLibrary) {
       return false;
     }
-    var type = typeName.type;
+    var type = namedType.type;
     return type is InterfaceType &&
         _typeProvider.isNonSubtypableClass(type.element);
   }
@@ -2538,7 +2539,7 @@
       return false;
     }
     bool foundError = false;
-    for (TypeName type in clause.interfaces) {
+    for (NamedType type in clause.interfaces) {
       if (_checkForExtendsOrImplementsDisallowedClass(
           type, CompileTimeErrorCode.IMPLEMENTS_DISALLOWED_CLASS)) {
         foundError = true;
@@ -2587,7 +2588,7 @@
   void _checkForImplicitDynamicType(TypeAnnotation? node) {
     if (_options.implicitDynamic ||
         node == null ||
-        (node is TypeName && node.typeArguments != null)) {
+        (node is NamedType && node.typeArguments != null)) {
       return;
     }
     DartType type = node.typeOrThrow;
@@ -3046,7 +3047,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_CLASS_DECLARES_CONSTRUCTOR].
   bool _checkForMixinClassDeclaresConstructor(
-      TypeName mixinName, ClassElement mixinElement) {
+      NamedType mixinName, ClassElement mixinElement) {
     for (ConstructorElement constructor in mixinElement.constructors) {
       if (!constructor.isSynthetic && !constructor.isFactory) {
         errorReporter.reportErrorForNode(
@@ -3066,7 +3067,7 @@
   ///
   /// See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
   bool _checkForMixinInheritsNotFromObject(
-      TypeName mixinName, ClassElement mixinElement) {
+      NamedType mixinName, ClassElement mixinElement) {
     var mixinSupertype = mixinElement.supertype;
     if (mixinSupertype == null || mixinSupertype.isDartCoreObject) {
       var mixins = mixinElement.mixins;
@@ -3087,7 +3088,8 @@
   /// Check that superclass constrains for the mixin type of [mixinName] at
   /// the [mixinIndex] position in the mixins list are satisfied by the
   /// [_enclosingClass], or a previous mixin.
-  bool _checkForMixinSuperclassConstraints(int mixinIndex, TypeName mixinName) {
+  bool _checkForMixinSuperclassConstraints(
+      int mixinIndex, NamedType mixinName) {
     InterfaceType mixinType = mixinName.type as InterfaceType;
     for (var constraint in mixinType.superclassConstraints) {
       var superType = _enclosingClass!.supertype as InterfaceTypeImpl;
@@ -3121,7 +3123,7 @@
   /// Check that the superclass of the given [mixinElement] at the given
   /// [mixinIndex] in the list of mixins of [_enclosingClass] has concrete
   /// implementations of all the super-invoked members of the [mixinElement].
-  bool _checkForMixinSuperInvokedMembers(int mixinIndex, TypeName mixinName,
+  bool _checkForMixinSuperInvokedMembers(int mixinIndex, NamedType mixinName,
       ClassElement mixinElement, InterfaceType mixinType) {
     var mixinElementImpl = mixinElement as ClassElementImpl;
     if (mixinElementImpl.superInvokedNames.isEmpty) {
@@ -3173,7 +3175,7 @@
   /// library that defines a private member that conflicts with a private name
   /// from the same library but from a superclass or a different mixin.
   void _checkForMixinWithConflictingPrivateMember(
-      WithClause? withClause, TypeName? superclassName) {
+      WithClause? withClause, NamedType? superclassName) {
     if (withClause == null) {
       return;
     }
@@ -3188,18 +3190,18 @@
     /// (which is defined in the given [library]) and it conflicts with another
     /// definition of that name inherited from the superclass.
     bool isConflictingName(
-        String name, LibraryElement library, TypeName typeName) {
+        String name, LibraryElement library, NamedType namedType) {
       if (Identifier.isPrivateName(name)) {
         Map<String, String> names =
             mixedInNames.putIfAbsent(library, () => <String, String>{});
         if (names.containsKey(name)) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
-              typeName,
-              [name, typeName.name.name, names[name]]);
+              namedType,
+              [name, namedType.name.name, names[name]]);
           return true;
         }
-        names[name] = typeName.name.name;
+        names[name] = namedType.name.name;
         var inheritedMember = _inheritanceManager.getMember2(
           declaredSupertype.element,
           Name(library.source.uri, name),
@@ -3208,9 +3210,9 @@
         if (inheritedMember != null) {
           errorReporter.reportErrorForNode(
               CompileTimeErrorCode.PRIVATE_COLLISION_IN_MIXIN_APPLICATION,
-              typeName, [
+              namedType, [
             name,
-            typeName.name.name,
+            namedType.name.name,
             inheritedMember.enclosingElement.name
           ]);
           return true;
@@ -3219,7 +3221,7 @@
       return false;
     }
 
-    for (TypeName mixinType in withClause.mixinTypes) {
+    for (NamedType mixinType in withClause.mixinTypes) {
       DartType type = mixinType.typeOrThrow;
       if (type is InterfaceType) {
         LibraryElement library = type.element.library;
@@ -3272,8 +3274,8 @@
   }
 
   /// Verify that the given instance creation [expression] invokes an existing
-  /// constructor. The [constructorName] is the constructor name. The [typeName]
-  /// is the name of the type defining the constructor.
+  /// constructor. The [constructorName] is the constructor name.
+  /// The [namedType] is the name of the type defining the constructor.
   ///
   /// This method assumes that the instance creation was tested to be 'new'
   /// before being called.
@@ -3282,12 +3284,12 @@
   void _checkForNewWithUndefinedConstructor(
       InstanceCreationExpression expression,
       ConstructorName constructorName,
-      TypeName typeName) {
+      NamedType namedType) {
     // OK if resolved
     if (constructorName.staticElement != null) {
       return;
     }
-    DartType type = typeName.typeOrThrow;
+    DartType type = namedType.typeOrThrow;
     if (type is InterfaceType) {
       ClassElement element = type.element;
       if (element.isEnum || element.isMixin) {
@@ -3296,7 +3298,7 @@
       }
     }
     // prepare class name
-    Identifier className = typeName.name;
+    Identifier className = namedType.name;
     // report as named or default constructor absence
     var name = constructorName.name;
     if (name != null) {
@@ -3361,7 +3363,7 @@
     }
   }
 
-  bool _checkForNoGenerativeConstructorsInSuperclass(TypeName? superclass) {
+  bool _checkForNoGenerativeConstructorsInSuperclass(NamedType? superclass) {
     var superType = _enclosingClass!.supertype;
     if (superType == null) {
       return false;
@@ -3441,16 +3443,16 @@
     }
   }
 
-  /// Verify the [typeName], used as the return type of a setter, is valid
+  /// Verify the [namedType], used as the return type of a setter, is valid
   /// (either `null` or the type 'void').
   ///
   /// See [StaticWarningCode.NON_VOID_RETURN_FOR_SETTER].
-  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? typeName) {
-    if (typeName != null) {
-      DartType type = typeName.typeOrThrow;
+  void _checkForNonVoidReturnTypeForSetter(TypeAnnotation? namedType) {
+    if (namedType != null) {
+      DartType type = namedType.typeOrThrow;
       if (!type.isVoid) {
         errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, typeName);
+            CompileTimeErrorCode.NON_VOID_RETURN_FOR_SETTER, namedType);
       }
     }
   }
@@ -3548,17 +3550,17 @@
       return false;
     }
     bool problemReported = false;
-    for (TypeName typeName in onClause.superclassConstraints) {
-      DartType type = typeName.typeOrThrow;
+    for (NamedType namedType in onClause.superclassConstraints) {
+      DartType type = namedType.typeOrThrow;
       if (type is InterfaceType) {
         if (_checkForExtendsOrImplementsDisallowedClass(
-            typeName,
+            namedType,
             CompileTimeErrorCode
                 .MIXIN_SUPER_CLASS_CONSTRAINT_DISALLOWED_CLASS)) {
           problemReported = true;
         } else {
           if (_checkForExtendsOrImplementsDeferredClass(
-              typeName,
+              namedType,
               CompileTimeErrorCode
                   .MIXIN_SUPER_CLASS_CONSTRAINT_DEFERRED_CLASS)) {
             problemReported = true;
@@ -3737,8 +3739,8 @@
           redirectedClass.isAbstract &&
           redirectedElement != null &&
           !redirectedElement.isFactory) {
-        String enclosingTypeName = _enclosingClass!.displayName;
-        String constructorStrName = enclosingTypeName;
+        String enclosingNamedType = _enclosingClass!.displayName;
+        String constructorStrName = enclosingNamedType;
         if (declaration.name != null) {
           constructorStrName += ".${declaration.name!.name}";
         }
@@ -3761,15 +3763,15 @@
           RedirectingConstructorInvocation invocation = initializer;
           var redirectingElement = invocation.staticElement;
           if (redirectingElement == null) {
-            String enclosingTypeName = _enclosingClass!.displayName;
-            String constructorStrName = enclosingTypeName;
+            String enclosingNamedType = _enclosingClass!.displayName;
+            String constructorStrName = enclosingNamedType;
             if (invocation.constructorName != null) {
               constructorStrName += ".${invocation.constructorName!.name}";
             }
             errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
                 invocation,
-                [constructorStrName, enclosingTypeName]);
+                [constructorStrName, enclosingNamedType]);
           } else {
             if (redirectingElement.isFactory) {
               errorReporter.reportErrorForNode(
@@ -3844,20 +3846,20 @@
     }
   }
 
-  void _checkForRepeatedType(List<TypeName>? typeNames, ErrorCode errorCode) {
-    if (typeNames == null) {
+  void _checkForRepeatedType(List<NamedType>? namedTypes, ErrorCode errorCode) {
+    if (namedTypes == null) {
       return;
     }
 
-    int count = typeNames.length;
+    int count = namedTypes.length;
     List<bool> detectedRepeatOnIndex = List<bool>.filled(count, false);
     for (int i = 0; i < count; i++) {
       if (!detectedRepeatOnIndex[i]) {
-        var type = typeNames[i].type;
+        var type = namedTypes[i].type;
         if (type is InterfaceType) {
           var element = type.element;
           for (int j = i + 1; j < count; j++) {
-            var otherNode = typeNames[j];
+            var otherNode = namedTypes[j];
             var otherType = otherNode.type;
             if (otherType is InterfaceType && otherType.element == element) {
               detectedRepeatOnIndex[j] = true;
@@ -4035,7 +4037,7 @@
   ///
   /// See [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS].
   void _checkForTypeAnnotationDeferredClass(TypeAnnotation? type) {
-    if (type is TypeName && type.isDeferred) {
+    if (type is NamedType && type.isDeferred) {
       errorReporter.reportErrorForNode(
           CompileTimeErrorCode.TYPE_ANNOTATION_DEFERRED_CLASS,
           type,
@@ -4060,7 +4062,7 @@
         TypeParameter? current = parameter;
         for (var step = 0; current != null; step++) {
           var bound = current.bound;
-          if (bound is TypeName) {
+          if (bound is NamedType) {
             current = elementToNode[bound.name.staticElement];
           } else {
             current = null;
@@ -4636,16 +4638,16 @@
     var interfacesMerger = InterfacesMerger(typeSystem);
     interfacesMerger.addWithSupertypes(supertype);
 
-    for (var typeName in withClause.mixinTypes) {
-      var mixinType = typeName.type;
+    for (var namedType in withClause.mixinTypes) {
+      var mixinType = namedType.type;
       if (mixinType is InterfaceType) {
         var mixinElement = mixinType.element;
-        if (typeName.typeArguments == null) {
+        if (namedType.typeArguments == null) {
           var mixinSupertypeConstraints = typeSystem
               .gatherMixinSupertypeConstraintsForInference(mixinElement);
           if (mixinSupertypeConstraints.isNotEmpty) {
             var matchingInterfaceTypes = _findInterfaceTypesForConstraints(
-              typeName,
+              namedType,
               mixinSupertypeConstraints,
               interfacesMerger.typeList,
             );
@@ -4664,8 +4666,8 @@
                 errorReporter.reportErrorForToken(
                     CompileTimeErrorCode
                         .MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION,
-                    typeName.name.beginToken,
-                    [typeName]);
+                    namedType.name.beginToken,
+                    [namedType]);
               }
             }
           }
@@ -4810,7 +4812,7 @@
     }
   }
 
-  InterfaceType? _findInterfaceTypeForMixin(TypeName mixin,
+  InterfaceType? _findInterfaceTypeForMixin(NamedType mixin,
       InterfaceType supertypeConstraint, List<InterfaceType> interfaceTypes) {
     var element = supertypeConstraint.element;
     InterfaceType? foundInterfaceType;
@@ -4838,7 +4840,7 @@
   }
 
   List<InterfaceType>? _findInterfaceTypesForConstraints(
-      TypeName mixin,
+      NamedType mixin,
       List<InterfaceType> supertypeConstraints,
       List<InterfaceType> interfaceTypes) {
     var result = <InterfaceType>[];
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index 5c672ce..f7ecada 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -69,7 +69,7 @@
     // Only the Allocator, Opaque and Struct class may be extended.
     var extendsClause = node.extendsClause;
     if (extendsClause != null) {
-      final TypeName superclass = extendsClause.superclass;
+      final NamedType superclass = extendsClause.superclass;
       final ffiClass = superclass.ffiClass;
       if (ffiClass != null) {
         final className = ffiClass.name;
@@ -99,7 +99,7 @@
     }
 
     // No classes from the FFI may be explicitly implemented.
-    void checkSupertype(TypeName typename, FfiCode subtypeOfFfiCode,
+    void checkSupertype(NamedType typename, FfiCode subtypeOfFfiCode,
         FfiCode subtypeOfStructCode) {
       final superName = typename.name.staticElement?.name;
       if (superName == _allocatorClassName) {
@@ -116,14 +116,14 @@
 
     var implementsClause = node.implementsClause;
     if (implementsClause != null) {
-      for (TypeName type in implementsClause.interfaces) {
+      for (NamedType type in implementsClause.interfaces) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_IMPLEMENTS,
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_IMPLEMENTS);
       }
     }
     var withClause = node.withClause;
     if (withClause != null) {
-      for (TypeName type in withClause.mixinTypes) {
+      for (NamedType type in withClause.mixinTypes) {
         checkSupertype(type, FfiCode.SUBTYPE_OF_FFI_CLASS_IN_WITH,
             FfiCode.SUBTYPE_OF_STRUCT_CLASS_IN_WITH);
       }
@@ -702,7 +702,7 @@
         final typeArg = (declaredType as InterfaceType).typeArguments.single;
         if (!_isSized(typeArg)) {
           AstNode errorNode = fieldType;
-          if (fieldType is TypeName) {
+          if (fieldType is NamedType) {
             var typeArguments = fieldType.typeArguments?.arguments;
             if (typeArguments != null && typeArguments.isNotEmpty) {
               errorNode = typeArguments[0];
@@ -1354,7 +1354,7 @@
   }
 }
 
-extension on TypeName {
+extension on NamedType {
   /// If this is a name of class from `dart:ffi`, return it.
   ClassElement? get ffiClass {
     return name.staticElement.ffiClass;
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 715eef2..588b150 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -1694,7 +1694,7 @@
             returnType: _getTypeAnnotationString(functionType.returnType),
             typeParameters: functionType.typeParameters?.toSource(),
           );
-        } else if (type is TypeName && type.name.name.isNotEmpty) {
+        } else if (type is NamedType && type.name.name.isNotEmpty) {
           addDeclaration(
             isDeprecated: isDeprecated,
             kind: DeclarationKind.TYPE_ALIAS,
diff --git a/pkg/analyzer/lib/src/summary2/default_types_builder.dart b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
index 388c95b..356de04 100644
--- a/pkg/analyzer/lib/src/summary2/default_types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/default_types_builder.dart
@@ -122,7 +122,7 @@
             current != null && step < typeParameters.length;
             ++step) {
           var bound = current.bound;
-          if (bound is TypeName) {
+          if (bound is NamedType) {
             var typeNameIdentifier = bound.name;
             if (typeNameIdentifier is SimpleIdentifier) {
               current = typeParametersByName[typeNameIdentifier.name];
diff --git a/pkg/analyzer/lib/src/summary2/simply_bounded.dart b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
index f279f1b..cc9870c 100644
--- a/pkg/analyzer/lib/src/summary2/simply_bounded.dart
+++ b/pkg/analyzer/lib/src/summary2/simply_bounded.dart
@@ -252,7 +252,7 @@
   /// Otherwise `true` is returned.
   bool _visitType(List<SimplyBoundedNode> dependencies, TypeAnnotation type,
       bool allowTypeParameters) {
-    if (type is TypeName) {
+    if (type is NamedType) {
       var element = type.name.staticElement;
 
       if (element is TypeParameterElement) {
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index b48b646..2c241ad 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -85,7 +85,7 @@
     if (hasSelfReference) return;
     if (node == null) return;
 
-    if (node is TypeName) {
+    if (node is NamedType) {
       var element = node.name.staticElement;
       if (element is! ElementImpl) {
         return;
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 4f9d087..fd30689 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -40,7 +40,7 @@
   return true;
 }
 
-List<InterfaceType> _toInterfaceTypeList(List<TypeName>? nodeList) {
+List<InterfaceType> _toInterfaceTypeList(List<NamedType>? nodeList) {
   if (nodeList != null) {
     return nodeList
         .map((e) => e.type)
diff --git a/pkg/analyzer/test/generated/expression_parser_test.dart b/pkg/analyzer/test/generated/expression_parser_test.dart
index 9119e76..c077772 100644
--- a/pkg/analyzer/test/generated/expression_parser_test.dart
+++ b/pkg/analyzer/test/generated/expression_parser_test.dart
@@ -1044,7 +1044,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type.name.name, 'A.B');
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1061,7 +1061,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNotNull);
@@ -1079,7 +1079,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
@@ -1096,7 +1096,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
@@ -1113,7 +1113,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1130,7 +1130,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
@@ -1147,7 +1147,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNotNull);
@@ -1164,7 +1164,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments, isNull);
     expect(name.period, isNotNull);
@@ -1182,7 +1182,7 @@
     expect(expression.keyword!.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
-    TypeName type = name.type;
+    NamedType type = name.type;
     expect(type, isNotNull);
     expect(type.typeArguments!.arguments, hasLength(1));
     expect(name.period, isNull);
@@ -1776,8 +1776,8 @@
     var identifier = asExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(asExpression.asOperator, isNotNull);
-    var typeName = asExpression.type as NamedType;
-    expect(typeName.name.name, 'Y');
+    var namedType = asExpression.type as NamedType;
+    expect(namedType.name.name, 'Y');
   }
 
   void test_parseRelationalExpression_as_functionType_noReturnType() {
@@ -1850,8 +1850,8 @@
     var identifier = isExpression.expression as SimpleIdentifier;
     expect(identifier.name, 'x');
     expect(isExpression.isOperator, isNotNull);
-    var typeName = isExpression.type as NamedType;
-    expect(typeName.name.name, 'Y');
+    var namedType = isExpression.type as NamedType;
+    expect(namedType.name.name, 'Y');
   }
 
   void test_parseRelationalExpression_isNot() {
diff --git a/pkg/analyzer/test/generated/recovery_parser_test.dart b/pkg/analyzer/test/generated/recovery_parser_test.dart
index e110012..dd2b25d 100644
--- a/pkg/analyzer/test/generated/recovery_parser_test.dart
+++ b/pkg/analyzer/test/generated/recovery_parser_test.dart
@@ -1086,7 +1086,7 @@
     expect(expression.notOperator, isNotNull);
     TypeAnnotation type = expression.type;
     expect(type, isNotNull);
-    expect(type is TypeName && type.name.isSynthetic, isTrue);
+    expect(type is NamedType && type.name.isSynthetic, isTrue);
     var thenStatement = ifStatement.thenStatement as ExpressionStatement;
     expect(thenStatement.semicolon!.isSynthetic, isTrue);
     var simpleId = thenStatement.expression as SimpleIdentifier;
diff --git a/pkg/analyzer/test/generated/simple_parser_test.dart b/pkg/analyzer/test/generated/simple_parser_test.dart
index a5072f7..73804a4 100644
--- a/pkg/analyzer/test/generated/simple_parser_test.dart
+++ b/pkg/analyzer/test/generated/simple_parser_test.dart
@@ -1750,8 +1750,8 @@
 
   void test_parseTypeAnnotation_named() {
     createParser('A<B>');
-    var typeName = parser.parseTypeAnnotation(false) as NamedType;
-    expectNotNullIfNoErrors(typeName);
+    var namedType = parser.parseTypeAnnotation(false) as NamedType;
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
   }
 
@@ -1851,20 +1851,20 @@
 
   void test_parseTypeName_parameterized() {
     createParser('List<int>');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
+    NamedType namedType = parser.parseTypeName(false);
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNotNull);
+    expect(namedType.name, isNotNull);
+    expect(namedType.typeArguments, isNotNull);
   }
 
   void test_parseTypeName_simple() {
     createParser('int');
-    TypeName typeName = parser.parseTypeName(false);
-    expectNotNullIfNoErrors(typeName);
+    NamedType namedType = parser.parseTypeName(false);
+    expectNotNullIfNoErrors(namedType);
     assertNoErrors();
-    expect(typeName.name, isNotNull);
-    expect(typeName.typeArguments, isNull);
+    expect(namedType.name, isNotNull);
+    expect(namedType.typeArguments, isNull);
   }
 
   void test_parseTypeParameter_bounded_functionType_noReturn() {
diff --git a/pkg/analyzer/test/generated/top_level_parser_test.dart b/pkg/analyzer/test/generated/top_level_parser_test.dart
index 0ec3d0a..6962aff 100644
--- a/pkg/analyzer/test/generated/top_level_parser_test.dart
+++ b/pkg/analyzer/test/generated/top_level_parser_test.dart
@@ -92,15 +92,15 @@
     // Ensure type parsed as "Future<List<[empty name]>>".
     expect(declaration.variables.type, isNotNull);
     expect(declaration.variables.type!.question, isNull);
-    expect(declaration.variables.type, TypeMatcher<TypeName>());
+    expect(declaration.variables.type, TypeMatcher<NamedType>());
     var type = declaration.variables.type as NamedType;
     expect(type.name.name, "Future");
     expect(type.typeArguments!.arguments.length, 1);
-    expect(type.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    expect(type.typeArguments!.arguments.single, TypeMatcher<NamedType>());
     var subType = type.typeArguments!.arguments.single as NamedType;
     expect(subType.name.name, "List");
     expect(subType.typeArguments!.arguments.length, 1);
-    expect(subType.typeArguments!.arguments.single, TypeMatcher<TypeName>());
+    expect(subType.typeArguments!.arguments.single, TypeMatcher<NamedType>());
     var subSubType = subType.typeArguments!.arguments.single as NamedType;
     expect(subSubType.name.name, "");
     expect(subSubType.typeArguments, isNull);
@@ -573,7 +573,7 @@
     expect(unit.declarations, hasLength(1));
   }
 
-  void test_parseCompilationUnit_pseudo_asTypeName() {
+  void test_parseCompilationUnit_pseudo_asNamedType() {
     for (Keyword keyword in Keyword.values) {
       if (keyword.isPseudo) {
         String lexeme = keyword.lexeme;
@@ -1949,7 +1949,7 @@
     expect(declaration.onClause, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
     expect(interfaces[0].name.name, 'B');
     expect(interfaces[0].typeArguments, isNull);
@@ -1971,7 +1971,7 @@
     expect(declaration.onClause, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(2));
     expect(interfaces[0].name.name, 'B');
     expect(interfaces[0].typeArguments!.arguments, hasLength(1));
@@ -2013,7 +2013,7 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
@@ -2035,7 +2035,7 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(2));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
@@ -2059,13 +2059,13 @@
     expect(declaration.documentationComment, isNull);
     var onClause = declaration.onClause!;
     expect(onClause.onKeyword, isNotNull);
-    NodeList<TypeName> constraints = onClause.superclassConstraints;
+    NodeList<NamedType> constraints = onClause.superclassConstraints;
     expect(constraints, hasLength(1));
     expect(constraints[0].name.name, 'B');
     expect(constraints[0].typeArguments, isNull);
     var implementsClause = declaration.implementsClause!;
     expect(implementsClause.implementsKeyword, isNotNull);
-    NodeList<TypeName> interfaces = implementsClause.interfaces;
+    NodeList<NamedType> interfaces = implementsClause.interfaces;
     expect(interfaces, hasLength(1));
     expect(interfaces[0].name.name, 'C');
     expect(interfaces[0].typeArguments, isNull);
diff --git a/pkg/analyzer/test/generated/utilities_test.dart b/pkg/analyzer/test/generated/utilities_test.dart
index b6d2157..4b26412 100644
--- a/pkg/analyzer/test/generated/utilities_test.dart
+++ b/pkg/analyzer/test/generated/utilities_test.dart
@@ -264,9 +264,9 @@
 }
 
 class Getter_NodeReplacerTest_test_classTypeAlias
-    implements NodeReplacerTest_Getter<ClassTypeAlias, TypeName> {
+    implements NodeReplacerTest_Getter<ClassTypeAlias, NamedType> {
   @override
-  TypeName get(ClassTypeAlias node) => node.superclass;
+  NamedType get(ClassTypeAlias node) => node.superclass;
 }
 
 class Getter_NodeReplacerTest_test_classTypeAlias_2
@@ -372,9 +372,9 @@
 }
 
 class Getter_NodeReplacerTest_test_constructorName
-    implements NodeReplacerTest_Getter<ConstructorName, TypeName> {
+    implements NodeReplacerTest_Getter<ConstructorName, NamedType> {
   @override
-  TypeName get(ConstructorName node) => node.type;
+  NamedType get(ConstructorName node) => node.type;
 }
 
 class Getter_NodeReplacerTest_test_constructorName_2
@@ -452,9 +452,9 @@
 }
 
 class Getter_NodeReplacerTest_test_extendsClause
-    implements NodeReplacerTest_Getter<ExtendsClause, TypeName> {
+    implements NodeReplacerTest_Getter<ExtendsClause, NamedType> {
   @override
-  TypeName get(ExtendsClause node) => node.superclass;
+  NamedType get(ExtendsClause node) => node.superclass;
 }
 
 class Getter_NodeReplacerTest_test_fieldDeclaration
@@ -947,15 +947,15 @@
 }
 
 class Getter_NodeReplacerTest_test_typeName
-    implements NodeReplacerTest_Getter<TypeName, TypeArgumentList> {
+    implements NodeReplacerTest_Getter<NamedType, TypeArgumentList> {
   @override
-  TypeArgumentList? get(TypeName node) => node.typeArguments;
+  TypeArgumentList? get(NamedType node) => node.typeArguments;
 }
 
 class Getter_NodeReplacerTest_test_typeName_2
-    implements NodeReplacerTest_Getter<TypeName, Identifier> {
+    implements NodeReplacerTest_Getter<NamedType, Identifier> {
   @override
-  Identifier get(TypeName node) => node.name;
+  Identifier get(NamedType node) => node.name;
 }
 
 class Getter_NodeReplacerTest_test_typeParameter
@@ -1221,11 +1221,11 @@
 }
 
 class ListGetter_NodeReplacerTest_test_implementsClause
-    extends NodeReplacerTest_ListGetter<ImplementsClause, TypeName> {
+    extends NodeReplacerTest_ListGetter<ImplementsClause, NamedType> {
   ListGetter_NodeReplacerTest_test_implementsClause(int arg0) : super(arg0);
 
   @override
-  NodeList<TypeName> getList(ImplementsClause node) => node.interfaces;
+  NodeList<NamedType> getList(ImplementsClause node) => node.interfaces;
 }
 
 class ListGetter_NodeReplacerTest_test_labeledStatement
@@ -1323,11 +1323,11 @@
 }
 
 class ListGetter_NodeReplacerTest_test_withClause
-    extends NodeReplacerTest_ListGetter<WithClause, TypeName> {
+    extends NodeReplacerTest_ListGetter<WithClause, NamedType> {
   ListGetter_NodeReplacerTest_test_withClause(int arg0) : super(arg0);
 
   @override
-  NodeList<TypeName> getList(WithClause node) => node.mixinTypes;
+  NodeList<NamedType> getList(WithClause node) => node.mixinTypes;
 }
 
 class ListGetter_NodeReplacerTest_testAnnotatedNode
@@ -2189,7 +2189,7 @@
   }
 
   void test_typeName() {
-    TypeName node = AstTestFactory.typeName4(
+    NamedType node = AstTestFactory.typeName4(
         "T", [AstTestFactory.typeName4("E"), AstTestFactory.typeName4("F")]);
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName_2());
     _assertReplace(node, Getter_NodeReplacerTest_test_typeName());
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 31572f3..de0bea2 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -1309,10 +1309,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aUnnamed));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, interfaceTypeNone(aElement));
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, interfaceTypeNone(aElement));
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1329,10 +1329,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(aNamed));
 
-      var typeName = constructorName.type;
-      expect(typeName.type, interfaceTypeNone(aElement));
+      var namedType = constructorName.type;
+      expect(namedType.type, interfaceTypeNone(aElement));
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1378,10 +1378,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, auType);
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, auType);
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1400,10 +1400,10 @@
       var constructorName = constructor.redirectedConstructor!;
       expect(constructorName.staticElement, same(actualMember));
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.type, auType);
+      NamedType namedType = constructorName.type;
+      expect(namedType.type, auType);
 
-      var identifier = typeName.name as SimpleIdentifier;
+      var identifier = namedType.name as SimpleIdentifier;
       expect(identifier.staticElement, same(aElement));
       expect(identifier.staticType, isNull);
 
@@ -1723,9 +1723,9 @@
 
     var statement = statements[0] as VariableDeclarationStatement;
 
-    var typeName = statement.variables.type as NamedType;
-    expect(typeName.type, isDynamicType);
-    expect(typeName.typeArguments!.arguments[0].type, typeProvider.intType);
+    var namedType = statement.variables.type as NamedType;
+    expect(namedType.type, isDynamicType);
+    expect(namedType.typeArguments!.arguments[0].type, typeProvider.intType);
 
     VariableDeclaration vNode = statement.variables.variables[0];
     expect(vNode.name.staticType, isNull);
@@ -2077,10 +2077,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      Identifier typeIdentifier = typeName.name;
+      Identifier typeIdentifier = namedType.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2095,10 +2095,10 @@
       expect(constructorName.staticElement, namedConstructor);
       expect(constructorName.name!.staticType, isNull);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2130,10 +2130,10 @@
     expect(constructorName.name, isNull);
     expect(constructorName.staticElement, constructorElement);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.typeArguments, isNull);
+    NamedType namedType = constructorName.type;
+    expect(namedType.typeArguments, isNull);
 
-    Identifier typeIdentifier = typeName.name;
+    Identifier typeIdentifier = namedType.name;
     expect(typeIdentifier.staticElement, xElement);
     expect(typeIdentifier.staticType, isNull);
 
@@ -2171,10 +2171,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      Identifier typeIdentifier = typeName.name;
+      Identifier typeIdentifier = namedType.name;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2193,10 +2193,10 @@
       expect(constructorName.name!.staticElement, namedConstructor);
       expect(constructorName.name!.staticType, isNull);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2245,10 +2245,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -2275,10 +2275,10 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2305,12 +2305,12 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
 
@@ -2360,10 +2360,10 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2382,12 +2382,12 @@
       expect(constructorName.name, isNull);
       expect(constructorName.staticElement, defaultConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(cElement));
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2407,10 +2407,10 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments, isNull);
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments, isNull);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2430,12 +2430,12 @@
       expect(constructorName.name!.staticType, isNull);
       expect(constructorName.staticElement, namedConstructor);
 
-      TypeName typeName = constructorName.type;
-      expect(typeName.typeArguments!.arguments, hasLength(1));
+      NamedType namedType = constructorName.type;
+      expect(namedType.typeArguments!.arguments, hasLength(1));
       _assertTypeNameSimple(
-          typeName.typeArguments!.arguments[0], typeProvider.boolType);
+          namedType.typeArguments!.arguments[0], typeProvider.boolType);
 
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, cElement);
       expect(typeIdentifier.staticType, isNull);
     }
@@ -2462,10 +2462,10 @@
       assertMember(creation, defaultConstructor, {'K': 'int', 'V': 'double'});
       assertType(creation, 'C<int, double>');
 
-      var typeName = creation.constructorName.type;
-      assertNamedType(typeName, cElement, 'C<int, double>');
+      var namedType = creation.constructorName.type;
+      assertNamedType(namedType, cElement, 'C<int, double>');
 
-      var typeArguments = typeName.typeArguments!.arguments;
+      var typeArguments = namedType.typeArguments!.arguments;
       assertNamedType(typeArguments[0] as NamedType, intElement, 'int');
       assertNamedType(typeArguments[1] as NamedType, doubleElement, 'double');
 
@@ -2481,10 +2481,10 @@
       assertMember(creation, namedConstructor, {'K': 'num', 'V': 'String'});
       assertType(creation, 'C<num, String>');
 
-      var typeName = creation.constructorName.type;
-      assertNamedType(typeName, cElement, 'C<num, String>');
+      var namedType = creation.constructorName.type;
+      assertNamedType(namedType, cElement, 'C<num, String>');
 
-      var typeArguments = typeName.typeArguments!.arguments;
+      var typeArguments = namedType.typeArguments!.arguments;
       assertNamedType(typeArguments[0] as NamedType, numElement, 'num');
       assertNamedType(typeArguments[1] as NamedType, stringElement, 'String');
 
@@ -3077,7 +3077,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name, isNull);
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       expect(type.typeArguments, isNull);
       assertElement(type.name, c);
       assertTypeNull(type.name);
@@ -3094,7 +3094,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name!.name, 'named');
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       expect(type.typeArguments, isNull);
       assertElement(type.name, c);
       assertType(type.name, 'C<bool>');
@@ -3111,7 +3111,7 @@
       ConstructorName constructorName = creation.constructorName;
       expect(constructorName.name!.name, 'named2');
 
-      TypeName type = constructorName.type;
+      NamedType type = constructorName.type;
       assertTypeArguments(type.typeArguments!, [doubleType]);
       assertElement(type.name, c);
       assertType(type.name, 'C<double>');
@@ -3640,8 +3640,8 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    var typeName = prefixedName.parent as NamedType;
-    expect(typeName.type, isDynamicType);
+    var namedType = prefixedName.parent as NamedType;
+    expect(namedType.type, isDynamicType);
   }
 
   @failingTest
@@ -3708,8 +3708,8 @@
     assertElement(tRef, tElement);
     assertTypeDynamic(tRef);
 
-    var typeName = prefixedName.parent as NamedType;
-    expect(typeName.type, isDynamicType);
+    var namedType = prefixedName.parent as NamedType;
+    expect(namedType.type, isDynamicType);
   }
 
   @failingTest
@@ -6949,7 +6949,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName superClass = dNode.extendsClause!.superclass;
+      NamedType superClass = dNode.extendsClause!.superclass;
       expect(superClass.type, expectedType);
 
       var identifier = superClass.name as SimpleIdentifier;
@@ -6963,7 +6963,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName mixinType = dNode.withClause!.mixinTypes[0];
+      NamedType mixinType = dNode.withClause!.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
       var identifier = mixinType.name as SimpleIdentifier;
@@ -6977,7 +6977,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName implementedType = dNode.implementsClause!.interfaces[0];
+      NamedType implementedType = dNode.implementsClause!.interfaces[0];
       expect(implementedType.type, expectedType);
 
       var identifier = implementedType.name as SimpleIdentifier;
@@ -7018,7 +7018,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName superClass = dNode.superclass;
+      NamedType superClass = dNode.superclass;
       expect(superClass.type, expectedType);
 
       var identifier = superClass.name as SimpleIdentifier;
@@ -7032,7 +7032,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName mixinType = dNode.withClause.mixinTypes[0];
+      NamedType mixinType = dNode.withClause.mixinTypes[0];
       expect(mixinType.type, expectedType);
 
       var identifier = mixinType.name as SimpleIdentifier;
@@ -7046,7 +7046,7 @@
         nullabilitySuffix: NullabilitySuffix.none,
       );
 
-      TypeName interfaceType = dNode.implementsClause!.interfaces[0];
+      NamedType interfaceType = dNode.implementsClause!.interfaces[0];
       expect(interfaceType.type, expectedType);
 
       var identifier = interfaceType.name as SimpleIdentifier;
@@ -7348,8 +7348,8 @@
       FieldElement bElement = cElement.getField('b')!;
       var bDeclaration = cNode.members[1] as FieldDeclaration;
 
-      var typeName = bDeclaration.fields.type as NamedType;
-      var typeIdentifier = typeName.name as SimpleIdentifier;
+      var namedType = bDeclaration.fields.type as NamedType;
+      var typeIdentifier = namedType.name as SimpleIdentifier;
       expect(typeIdentifier.staticElement, same(tElement));
       expect(typeIdentifier.staticType, isNull);
 
@@ -7438,8 +7438,8 @@
       expect(bElement, same(unitElement.topLevelVariables[1]));
       expect(bElement.type, typeProvider.doubleType);
 
-      var typeName = bDeclaration.variables.type as NamedType;
-      _assertTypeNameSimple(typeName, typeProvider.doubleType);
+      var namedType = bDeclaration.variables.type as NamedType;
+      _assertTypeNameSimple(namedType, typeProvider.doubleType);
 
       expect(bNode.name.staticElement, same(bElement));
       expect(bNode.name.staticType, isNull);
@@ -7792,9 +7792,9 @@
         statements[0] as VariableDeclarationStatement;
     var type = variableDeclarationStatement.variables.type as NamedType;
     expect(type.type, isDynamicType);
-    var typeName = type.name;
-    assertTypeNull(typeName);
-    expect(typeName.staticElement, same(typeProvider.dynamicType.element));
+    var namedType = type.name;
+    assertTypeNull(namedType);
+    expect(namedType.staticElement, same(typeProvider.dynamicType.element));
   }
 
   test_type_functionTypeAlias() async {
@@ -7812,14 +7812,14 @@
 
     FieldDeclaration fDeclaration = findNode.fieldDeclaration('F<int> f');
 
-    var typeName = fDeclaration.fields.type as NamedType;
-    assertType(typeName, 'int Function(bool)');
+    var namedType = fDeclaration.fields.type as NamedType;
+    assertType(namedType, 'int Function(bool)');
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, same(aliasElement));
     expect(typeIdentifier.staticType, isNull);
 
-    List<TypeAnnotation> typeArguments = typeName.typeArguments!.arguments;
+    List<TypeAnnotation> typeArguments = namedType.typeArguments!.arguments;
     expect(typeArguments, hasLength(1));
     _assertTypeNameSimple(typeArguments[0], typeProvider.intType);
   }
@@ -7836,9 +7836,9 @@
         statements[0] as VariableDeclarationStatement;
     var type = variableDeclarationStatement.variables.type as NamedType;
     expect(type.type, isVoidType);
-    var typeName = type.name;
-    expect(typeName.staticType, isNull);
-    expect(typeName.staticElement, isNull);
+    var namedType = type.name;
+    expect(namedType.staticType, isNull);
+    expect(namedType.staticElement, isNull);
   }
 
   test_typeAnnotation_prefixed() async {
@@ -7863,9 +7863,9 @@
 
     {
       var declaration = unit.declarations[0] as TopLevelVariableDeclaration;
-      var typeName = declaration.variables.type as NamedType;
+      var namedType = declaration.variables.type as NamedType;
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'b');
@@ -7876,9 +7876,9 @@
 
     {
       var declaration = unit.declarations[1] as TopLevelVariableDeclaration;
-      var typeName = declaration.variables.type as NamedType;
+      var namedType = declaration.variables.type as NamedType;
 
-      var typeIdentifier = typeName.name as PrefixedIdentifier;
+      var typeIdentifier = namedType.name as PrefixedIdentifier;
       expect(typeIdentifier.staticElement, aClass);
 
       expect(typeIdentifier.prefix.name, 'c');
@@ -7951,14 +7951,14 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isNull);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -7983,10 +7983,10 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -7998,7 +7998,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8027,10 +8027,10 @@
     ConstructorName constructorName = creation.constructorName;
     expect(constructorName.name, isNull);
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     expect(typePrefixed.staticElement, isNull);
     expect(typePrefixed.staticType, isDynamicType);
 
@@ -8042,7 +8042,7 @@
     expect(typeIdentifier.staticElement, isNull);
     expect(typeIdentifier.staticType, isDynamicType);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8065,10 +8065,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8083,7 +8083,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8111,10 +8111,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    expect(typeName.type, isDynamicType);
+    NamedType namedType = constructorName.type;
+    expect(namedType.type, isDynamicType);
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElementNull(typePrefixed);
     assertTypeNull(typePrefixed);
 
@@ -8129,7 +8129,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8158,10 +8158,10 @@
 
     ConstructorName constructorName = creation.constructorName;
 
-    TypeName typeName = constructorName.type;
-    assertType(typeName, 'Random');
+    NamedType namedType = constructorName.type;
+    assertType(namedType, 'Random');
 
-    var typePrefixed = typeName.name as PrefixedIdentifier;
+    var typePrefixed = namedType.name as PrefixedIdentifier;
     assertElement(typePrefixed, randomElement);
     assertTypeNull(typePrefixed);
 
@@ -8176,7 +8176,7 @@
     assertElementNull(constructorName.name);
     assertTypeNull(constructorName.name!);
 
-    assertTypeArguments(typeName.typeArguments!, [intType, doubleType]);
+    assertTypeArguments(namedType.typeArguments!, [intType, doubleType]);
     _assertInvocationArguments(creation.argumentList,
         [checkTopVarRef('arg1'), checkTopVarUndefinedNamedRef('arg2')]);
   }
@@ -8627,10 +8627,10 @@
     var constructorElement = classElement.unnamedConstructor;
     expect(constructorName.staticElement, constructorElement);
 
-    var typeName = constructorName.type;
-    expect(typeName.typeArguments, isNull);
+    var namedType = constructorName.type;
+    expect(namedType.typeArguments, isNull);
 
-    var typeIdentifier = typeName.name as SimpleIdentifier;
+    var typeIdentifier = namedType.name as SimpleIdentifier;
     assertElement(typeIdentifier, classElement);
     assertTypeNull(typeIdentifier);
 
@@ -8681,18 +8681,18 @@
     expect(node.declaredElement, same(element));
     expect(node.identifier!.staticElement, same(element));
 
-    var typeName = node.type as NamedType?;
-    if (typeName != null) {
-      expect(typeName.type, type);
-      expect(typeName.name.staticElement, same(type!.element));
+    var namedType = node.type as NamedType?;
+    if (namedType != null) {
+      expect(namedType.type, type);
+      expect(namedType.name.staticElement, same(type!.element));
     }
   }
 
-  void _assertTypeNameSimple(TypeAnnotation typeName, DartType type) {
-    typeName as NamedType;
-    expect(typeName.type, type);
+  void _assertTypeNameSimple(TypeAnnotation namedType, DartType type) {
+    namedType as NamedType;
+    expect(namedType.type, type);
 
-    var identifier = typeName.name as SimpleIdentifier;
+    var identifier = namedType.name as SimpleIdentifier;
     expect(identifier.staticElement, same(type.element));
     expect(identifier.staticType, isNull);
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 98342e7..5f835d6 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -181,9 +181,9 @@
     assertElement(node, expectedConstructorElement);
     assertType(node, expectedType);
 
-    var typeName = node.constructorName.type;
+    var namedType = node.constructorName.type;
     expectedTypeNameElement ??= expectedClassElement;
-    assertNamedType(typeName, expectedTypeNameElement, null,
+    assertNamedType(namedType, expectedTypeNameElement, null,
         expectedPrefix: expectedPrefix);
   }
 
@@ -461,9 +461,9 @@
 
     assertType(creation, expectedType);
 
-    var typeName = creation.constructorName.type;
+    var namedType = creation.constructorName.type;
     expectedTypeNameElement ??= expectedClassElement;
-    assertNamedType(typeName, expectedTypeNameElement, expectedType,
+    assertNamedType(namedType, expectedTypeNameElement, expectedType,
         expectedPrefix: expectedPrefix);
   }
 
@@ -763,7 +763,7 @@
       actual = typeOrNode.staticType;
     } else if (typeOrNode is GenericFunctionType) {
       actual = typeOrNode.type;
-    } else if (typeOrNode is TypeName) {
+    } else if (typeOrNode is NamedType) {
       actual = typeOrNode.type;
     } else {
       fail('Unsupported node: (${typeOrNode.runtimeType}) $typeOrNode');
@@ -913,7 +913,7 @@
       return node.staticElement;
     } else if (node is PropertyAccess) {
       return node.propertyName.staticElement;
-    } else if (node is TypeName) {
+    } else if (node is NamedType) {
       return node.name.staticElement;
     } else {
       fail('Unsupported node: (${node.runtimeType}) $node');
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index d855849..d444d31 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -1120,7 +1120,7 @@
         return;
       }
       optype.isPrefixed = true;
-      if (node.parent is TypeName && node.parent?.parent is ConstructorName) {
+      if (node.parent is NamedType && node.parent?.parent is ConstructorName) {
         optype.includeConstructorSuggestions = true;
       } else if (node.parent is Annotation) {
         optype.includeConstructorSuggestions = true;
diff --git a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
index 8181406..4a7dd04 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/visitors/local_declaration_visitor.dart
@@ -12,7 +12,7 @@
 /// declarations in those nodes. Consumers typically call [visit] which catches
 /// the exception thrown by [finished].
 abstract class LocalDeclarationVisitor extends GeneralizingAstVisitor {
-  static final TypeName STACKTRACE_TYPE = astFactory.typeName(
+  static final NamedType STACKTRACE_TYPE = astFactory.typeName(
       astFactory
           .simpleIdentifier(StringToken(TokenType.IDENTIFIER, 'StackTrace', 0)),
       null);
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 9092f5c..3b8b71b 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -144,14 +144,14 @@
     var nativeClasses = JsInteropChecks.getNativeClasses(component);
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
     for (var library in libraries) {
-      // TODO (rileyporter): Merge js_util optimizations with other lowerings
-      // in the single pass in `transformations/lowering.dart`.
-      jsUtilOptimizer.visitLibrary(library);
       JsInteropChecks(
               coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
               nativeClasses)
           .visitLibrary(library);
+      // TODO (rileyporter): Merge js_util optimizations with other lowerings
+      // in the single pass in `transformations/lowering.dart`.
+      jsUtilOptimizer.visitLibrary(library);
     }
     lowering.transformLibraries(libraries, coreTypes, hierarchy, options);
     logger?.call("Lowering transformations performed");
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index 2f8ae5c..0ee8532 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -160,12 +160,12 @@
     var jsUtilOptimizer = JsUtilOptimizer(coreTypes, hierarchy);
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
-      jsUtilOptimizer.visitLibrary(library);
       JsInteropChecks(
               coreTypes,
               diagnosticReporter as DiagnosticReporter<Message, LocatedMessage>,
               _nativeClasses!)
           .visitLibrary(library);
+      jsUtilOptimizer.visitLibrary(library);
     }
   }
 
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 078631a..e355526 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -1934,7 +1934,7 @@
       // _nullCheckHints.
       var token = typeName.endToken;
       _nullCheckHints[token] = getPostfixHint(token);
-      typeNameVisited(
+      namedTypeVisited(
           typeName); // Note this has been visited to TypeNameTracker.
       return null;
     } finally {
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index 91bb299..b12f9ec 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -384,7 +384,7 @@
 /// this class is used for the edge connecting the type of x's type parameter
 /// with the type bound in the declaration of C.
 class InstantiateToBoundsOrigin extends EdgeOrigin {
-  InstantiateToBoundsOrigin(Source? source, TypeName node)
+  InstantiateToBoundsOrigin(Source? source, NamedType node)
       : super(source, node);
 
   @override
@@ -671,7 +671,7 @@
 /// unioned with references to the nodes referring to source code. The origin of
 /// those union edges will be [TypedefReferenceOrigin].
 class TypedefReferenceOrigin extends EdgeOrigin {
-  TypedefReferenceOrigin(Source? source, TypeName node) : super(source, node);
+  TypedefReferenceOrigin(Source? source, NamedType node) : super(source, node);
 
   @override
   String get description => 'reference to typedef';
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 3b8b51c..624c4df 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -539,7 +539,7 @@
     Map<String, DecoratedType?> namedParameters =
         const <String, DecoratedType>{};
     if (type is InterfaceType && type.element.typeParameters.isNotEmpty) {
-      if (node is TypeName) {
+      if (node is NamedType) {
         if (node.typeArguments == null) {
           int index = 0;
           typeArguments = type.typeArguments
@@ -621,7 +621,7 @@
 
   @override
   DecoratedType visitTypeName(TypeName node) {
-    typeNameVisited(node); // Note this has been visited to TypeNameTracker.
+    namedTypeVisited(node); // Note this has been visited to TypeNameTracker.
     return visitTypeAnnotation(node);
   }
 
@@ -864,11 +864,11 @@
   void _handleSupertypeClauses(
       NamedCompilationUnitMember astNode,
       ClassElement declaredElement,
-      TypeName? superclass,
+      NamedType? superclass,
       WithClause? withClause,
       ImplementsClause? implementsClause,
       OnClause? onClause) {
-    var supertypes = <TypeName?>[];
+    var supertypes = <NamedType?>[];
     supertypes.add(superclass);
     if (withClause != null) {
       supertypes.addAll(withClause.mixinTypes);
diff --git a/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart b/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
index 520fda8..4e36f91 100644
--- a/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/completeness_tracker.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/annotation_tracker.dart';
+import 'package:nnbd_migration/src/utilities/permissive_mode.dart';
 import 'package:nnbd_migration/src/utilities/type_name_tracker.dart';
 
 /// Mixin that verifies (via assertion checks) that a visitor visits a
@@ -17,12 +17,6 @@
   AnnotationTracker? _annotationTracker;
   TypeNameTracker? _typeNameTracker;
 
-  @override
-  T? visitAnnotation(Annotation node) {
-    annotationVisited(node);
-    return super.visitAnnotation(node);
-  }
-
   void annotationVisited(Annotation node) {
     assert(() {
       _annotationTracker!.nodeVisited(node);
@@ -30,7 +24,7 @@
     }());
   }
 
-  void typeNameVisited(TypeName node) {
+  void namedTypeVisited(NamedType node) {
     assert(() {
       _typeNameTracker!.nodeVisited(node);
       return true;
@@ -38,6 +32,12 @@
   }
 
   @override
+  T? visitAnnotation(Annotation node) {
+    annotationVisited(node);
+    return super.visitAnnotation(node);
+  }
+
+  @override
   T? visitCompilationUnit(CompilationUnit node) {
     T? result;
     reportExceptionsIfPermissive(node, () {
diff --git a/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart b/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
index 67a1817..90d8b06 100644
--- a/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
+++ b/pkg/nnbd_migration/lib/src/utilities/type_name_tracker.dart
@@ -5,11 +5,11 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 
-/// A simple class to find all [TypeName]s and track if they all get visited.
+/// A simple class to find all [NamedType]s and track if they all get visited.
 class TypeNameTracker extends RecursiveAstVisitor<void> {
-  final Set<TypeName> _nodes = {};
+  final Set<NamedType> _nodes = {};
 
-  bool _isTrueTypeName(TypeName node) {
+  bool _isTrueNamedType(NamedType node) {
     final parent = node.parent;
     if (parent is ConstructorName) {
       // We only need to visit C in `new C()`, just `int` in `new C<int>()`.
@@ -21,14 +21,14 @@
 
   @override
   void visitTypeName(TypeName node) {
-    if (_isTrueTypeName(node)) {
+    if (_isTrueNamedType(node)) {
       _nodes.add(node);
     }
     super.visitTypeName(node);
   }
 
-  void nodeVisited(TypeName node) {
-    if (_isTrueTypeName(node) && !_nodes.remove(node)) {
+  void nodeVisited(NamedType node) {
+    if (_isTrueNamedType(node) && !_nodes.remove(node)) {
       throw StateError('Visited unexpected type name $node');
     }
   }
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index 11775fc..eefb057 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -1559,7 +1559,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ tst(R0, Operand(1 << target::ObjectAlignment::kNewObjectBitPosition));
   __ b(&add_to_mark_stack, ZERO);
 
@@ -1581,13 +1581,15 @@
   // Save values being destroyed.
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));
 
-  // Atomically set the remembered bit of the object header.
+  // Atomically clear kOldAndNotRememberedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R1, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldrex/strex do not support offsets).
   Label retry;
   __ Bind(&retry);
   __ ldrex(R2, R3);
+  __ tst(R2, Operand(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ b(&lost_race, ZERO);
   __ bic(R2, R2, Operand(1 << target::UntaggedObject::kOldAndNotRememberedBit));
   __ strex(R4, R2, R3);
   __ cmp(R4, Operand(1));
@@ -1629,7 +1631,7 @@
   __ Bind(&add_to_mark_stack);
   __ PushList((1 << R2) | (1 << R3) | (1 << R4));  // Spill.
 
-  Label marking_retry, lost_race, marking_overflow;
+  Label marking_retry, marking_overflow;
   // Atomically clear kOldAndNotMarkedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R0, Operand(kHeapObjectTag));
@@ -1665,6 +1667,7 @@
   __ Ret();
 
   __ Bind(&lost_race);
+  __ clrex();
   __ PopList((1 << R2) | (1 << R3) | (1 << R4));  // Unspill.
   __ Ret();
 
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 9af7272..0eeef85 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -1717,7 +1717,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ tbz(&add_to_mark_stack, R0,
          target::ObjectAlignment::kNewObjectBitPosition);
 
@@ -1739,13 +1739,14 @@
   __ Push(R3);
   __ Push(R4);
 
-  // Atomically set the remembered bit of the object header.
+  // Atomically clear kOldAndNotRememberedBit.
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R1, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
   Label retry;
   __ Bind(&retry);
   __ ldxr(R2, R3, kEightBytes);
+  __ tbz(&lost_race, R2, target::UntaggedObject::kOldAndNotRememberedBit);
   __ AndImmediate(R2, R2,
                   ~(1 << target::UntaggedObject::kOldAndNotRememberedBit));
   __ stxr(R4, R2, R3, kEightBytes);
@@ -1791,7 +1792,7 @@
   __ Push(R4);  // Spill.
 
   // Atomically clear kOldAndNotMarkedBit.
-  Label marking_retry, lost_race, marking_overflow;
+  Label marking_retry, marking_overflow;
   ASSERT(target::Object::tags_offset() == 0);
   __ sub(R3, R0, Operand(kHeapObjectTag));
   // R3: Untagged address of header word (ldxr/stxr do not support offsets).
@@ -1828,6 +1829,7 @@
   __ ret();
 
   __ Bind(&lost_race);
+  __ clrex();
   __ Pop(R4);  // Unspill.
   __ Pop(R3);  // Unspill.
   __ Pop(R2);  // Unspill.
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index ea1b6a4..654e0ef 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -1349,10 +1349,20 @@
 #endif
   }
 
-  // lock+andl is an atomic read-modify-write.
-  __ lock();
-  __ andl(FieldAddress(EDX, target::Object::tags_offset()),
+  // Atomically clear kOldAndNotRememberedBit.
+  Label retry, lost_race;
+  __ movl(EAX, FieldAddress(EDX, target::Object::tags_offset()));
+  __ Bind(&retry);
+  __ movl(ECX, EAX);
+  __ testl(ECX,
+           Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ j(ZERO, &lost_race);  // Remembered by another thread.
+  __ andl(ECX,
           Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  // Cmpxchgl: compare value = implicit operand EAX, new value = ECX.
+  // On failure, EAX is updated with the current value.
+  __ LockCmpxchgl(FieldAddress(EDX, target::Object::tags_offset()), ECX);
+  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1390,6 +1400,11 @@
   __ LeaveCallRuntimeFrame();
   __ ret();
 
+  __ Bind(&lost_race);
+  __ popl(ECX);  // Unspill.
+  __ popl(EAX);  // Unspill.
+  __ ret();
+
   if (cards) {
     Label remember_card_slow;
 
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 4017ed4..12079e9 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -1657,7 +1657,7 @@
 static void GenerateWriteBarrierStubHelper(Assembler* assembler,
                                            Address stub_code,
                                            bool cards) {
-  Label add_to_mark_stack, remember_card;
+  Label add_to_mark_stack, remember_card, lost_race;
   __ testq(RAX, Immediate(1 << target::ObjectAlignment::kNewObjectBitPosition));
   __ j(ZERO, &add_to_mark_stack);
 
@@ -1676,17 +1676,23 @@
 #endif
   }
 
-  // Update the tags that this object has been remembered.
-  // RDX: Address being stored
-  // RAX: Current tag value
-  // lock+andq is an atomic read-modify-write.
-  __ lock();
-  __ andq(FieldAddress(RDX, target::Object::tags_offset()),
-          Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  __ pushq(RAX);  // Spill.
+  __ pushq(RCX);  // Spill.
 
-  // Save registers being destroyed.
-  __ pushq(RAX);
-  __ pushq(RCX);
+  // Atomically clear kOldAndNotRemembered.
+  Label retry;
+  __ movq(RAX, FieldAddress(RDX, target::Object::tags_offset()));
+  __ Bind(&retry);
+  __ movq(RCX, RAX);
+  __ testq(RCX,
+           Immediate(1 << target::UntaggedObject::kOldAndNotRememberedBit));
+  __ j(ZERO, &lost_race);  // Remembered by another thread.
+  __ andq(RCX,
+          Immediate(~(1 << target::UntaggedObject::kOldAndNotRememberedBit)));
+  // Cmpxchgq: compare value = implicit operand RAX, new value = RCX.
+  // On failure, RAX is updated with the current value.
+  __ LockCmpxchgq(FieldAddress(RDX, target::Object::tags_offset()), RCX);
+  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
 
   // Load the StoreBuffer block out of the thread. Then load top_ out of the
   // StoreBufferBlock and add the address to the pointers_.
@@ -1704,9 +1710,8 @@
   __ incq(RCX);
   __ movl(Address(RAX, target::StoreBufferBlock::top_offset()), RCX);
   __ cmpl(RCX, Immediate(target::StoreBufferBlock::kSize));
-  // Restore values.
-  __ popq(RCX);
-  __ popq(RAX);
+  __ popq(RCX);  // Unspill.
+  __ popq(RAX);  // Unspill.
   __ j(EQUAL, &overflow, Assembler::kNearJump);
   __ ret();
 
@@ -1728,15 +1733,17 @@
   __ movq(TMP, RAX);  // RAX is fixed implicit operand of CAS.
 
   // Atomically clear kOldAndNotMarkedBit.
-  Label retry, lost_race, marking_overflow;
+  Label retry_marking, marking_overflow;
   __ movq(RAX, FieldAddress(TMP, target::Object::tags_offset()));
-  __ Bind(&retry);
+  __ Bind(&retry_marking);
   __ movq(RCX, RAX);
   __ testq(RCX, Immediate(1 << target::UntaggedObject::kOldAndNotMarkedBit));
   __ j(ZERO, &lost_race);  // Marked by another thread.
   __ andq(RCX, Immediate(~(1 << target::UntaggedObject::kOldAndNotMarkedBit)));
+  // Cmpxchgq: compare value = implicit operand RAX, new value = RCX.
+  // On failure, RAX is updated with the current value.
   __ LockCmpxchgq(FieldAddress(TMP, target::Object::tags_offset()), RCX);
-  __ j(NOT_EQUAL, &retry, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &retry_marking, Assembler::kNearJump);
 
   __ movq(RAX, Address(THR, target::Thread::marking_stack_block_offset()));
   __ movl(RCX, Address(RAX, target::MarkingStackBlock::top_offset()));
diff --git a/tests/lib/js/external_extension_members_test.dart b/tests/lib/js/external_extension_members_test.dart
new file mode 100644
index 0000000..6c9caa2
--- /dev/null
+++ b/tests/lib/js/external_extension_members_test.dart
@@ -0,0 +1,107 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Tests behavior of external extension members, which are routed to js_util
+// calls by a CFE transformation.
+
+@JS()
+library external_extension_members_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(int a);
+}
+
+extension FooExt on Foo {
+  external var field;
+  external final finalField;
+  @JS('fieldAnnotation')
+  external var annotatedField;
+
+  external get getter;
+  @JS('getterAnnotation')
+  external get annotatedGetter;
+
+  external set setter(_);
+  @JS('setterAnnotation')
+  external set annotatedSetter(_);
+}
+
+@JS('module.Bar')
+class Bar {
+  external Bar(int a);
+}
+
+extension BarExt on Bar {
+  @JS('field')
+  external var barField;
+}
+
+void main() {
+  eval(r"""
+    function Foo(a) {
+      this.field = a;
+      this.fieldAnnotation = a;
+      this.finalField = a;
+
+      this.getter = a;
+      this.getterAnnotation = a;
+    }
+
+    var module = {Bar: Foo};
+    """);
+
+  test('fields', () {
+    var foo = Foo(42);
+    // field getters
+    expect(foo.field, equals(42));
+    expect(foo.finalField, equals(42));
+    expect(foo.annotatedField, equals(42));
+
+    // field setters
+    foo.field = 'squid';
+    expect(foo.field, equals('squid'));
+
+    foo.annotatedField = 'octopus';
+    expect(foo.annotatedField, equals('octopus'));
+    js_util.setProperty(foo, 'fieldAnnotation', 'clownfish');
+    expect(foo.annotatedField, equals('clownfish'));
+  });
+
+  test('getters', () {
+    var foo = Foo(42);
+    expect(foo.getter, equals(42));
+    expect(foo.annotatedGetter, equals(42));
+
+    js_util.setProperty(foo, 'getterAnnotation', 'eel');
+    expect(foo.annotatedGetter, equals('eel'));
+  });
+
+  test('setters', () {
+    var foo = Foo(42);
+    foo.setter = 'starfish';
+    expect(js_util.getProperty(foo, 'setter'), equals('starfish'));
+
+    foo.annotatedSetter = 'whale';
+    expect(js_util.getProperty(foo, 'setterAnnotation'), equals('whale'));
+  });
+
+  test('module class', () {
+    var bar = Bar(5);
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(bar.barField, equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(5));
+
+    bar.barField = 10;
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(10));
+  });
+}
diff --git a/tests/lib_2/js/external_extension_members_test.dart b/tests/lib_2/js/external_extension_members_test.dart
new file mode 100644
index 0000000..a2c08a1
--- /dev/null
+++ b/tests/lib_2/js/external_extension_members_test.dart
@@ -0,0 +1,89 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart = 2.9
+
+// Tests behavior of external extension members, which are routed to js_util
+// calls by a CFE transformation.
+
+@JS()
+library external_extension_members_test;
+
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+import 'package:expect/minitest.dart';
+
+@JS()
+external void eval(String code);
+
+@JS()
+class Foo {
+  external Foo(int a);
+}
+
+extension FooExt on Foo {
+  external get getter;
+  @JS('getterAnnotation')
+  external get annotatedGetter;
+
+  external set setter(_);
+  @JS('setterAnnotation')
+  external set annotatedSetter(_);
+}
+
+@JS('module.Bar')
+class Bar {
+  external Bar(int a);
+}
+
+extension BarExt on Bar {
+  @JS('field')
+  external get barFieldGetter;
+  @JS('field')
+  external set barFieldSetter(_);
+}
+
+void main() {
+  eval(r"""
+    function Foo(a) {
+      this.field = a;
+      this.fieldAnnotation = a;
+      this.finalField = a;
+
+      this.getter = a;
+      this.getterAnnotation = a;
+    }
+
+    var module = {Bar: Foo};
+    """);
+
+  test('getters', () {
+    var foo = Foo(42);
+    expect(foo.getter, equals(42));
+    expect(foo.annotatedGetter, equals(42));
+
+    js_util.setProperty(foo, 'getterAnnotation', 'eel');
+    expect(foo.annotatedGetter, equals('eel'));
+  });
+
+  test('setters', () {
+    var foo = Foo(42);
+    foo.setter = 'starfish';
+    expect(js_util.getProperty(foo, 'setter'), equals('starfish'));
+
+    foo.annotatedSetter = 'whale';
+    expect(js_util.getProperty(foo, 'setterAnnotation'), equals('whale'));
+  });
+
+  test('module class', () {
+    var bar = Bar(5);
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(bar.barFieldGetter, equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(5));
+
+    bar.barFieldSetter = 10;
+    expect(js_util.getProperty(bar, 'fieldAnnotation'), equals(5));
+    expect(js_util.getProperty(bar, 'field'), equals(10));
+  });
+}
diff --git a/tools/VERSION b/tools/VERSION
index eb841a6..24ddf59 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 15
 PATCH 0
-PRERELEASE 135
+PRERELEASE 136
 PRERELEASE_PATCH 0
\ No newline at end of file
