diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index 991fc7c..81f1366 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -2667,7 +2667,6 @@
 
   @override
   List<PropertyAccessorElement> get accessors {
-    linkedData?.read(this);
     return _accessors;
   }
 
@@ -2679,10 +2678,6 @@
     return fields.where((field) => !field.isSynthetic).toList();
   }
 
-  List<FieldElement> get constants_unresolved {
-    return _fields.where((field) => !field.isSynthetic).toList();
-  }
-
   @override
   List<ConstructorElement> get constructors {
     return _constructors;
@@ -2697,7 +2692,6 @@
 
   @override
   List<FieldElement> get fields {
-    linkedData?.read(this);
     return _fields;
   }
 
@@ -2736,7 +2730,6 @@
 
   @override
   List<MethodElement> get methods {
-    linkedData?.read(this);
     return _methods;
   }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index c6522fb..0f6da71 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -406,8 +406,13 @@
 
     _withElementWalker(ElementWalker.forClass(element), () {
       _withNameScope(() {
+        _buildTypeParameterElements(node.typeParameters);
+        node.typeParameters?.accept(this);
+
         _defineElements(element.accessors);
+        _defineElements(element.methods);
         node.constants.accept(this);
+        node.members.accept(this);
       });
     });
   }
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 9d9dadd..3c46109 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -407,11 +407,8 @@
       fields.addAll(
         holder2.properties.whereType<FieldElementImpl>(),
       );
-      accessors.addAll(
-        holder2.propertyAccessors,
-      );
-      // TODO(scheglov) implement
-      // element.methods = holder2.methods;
+      accessors.addAll(holder2.propertyAccessors);
+      methods.addAll(holder2.methods);
     }
 
     // TODO(scheglov) only if no explicit
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 1c3b927..f8c9fdb 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -274,34 +274,28 @@
 
   void _applyToEnumDeclaration(
     ClassElement element,
-    _InfoEnumDeclaration info,
+    _InfoClassDeclaration info,
   ) {
     element as EnumElementImpl;
     element.setCodeRange(info.codeOffset, info.codeLength);
     element.nameOffset = info.nameOffset;
     element.documentationComment = info.documentationComment;
+
     _applyToTypeParameters(
       element.typeParameters_unresolved,
       info.typeParameters,
     );
-
-    forCorrespondingPairs<FieldElement, _InfoEnumConstantDeclaration>(
-      element.constants_unresolved,
-      info.constants,
-      (element, info) {
-        element as FieldElementImpl;
-        element.setCodeRange(info.codeOffset, info.codeLength);
-        element.nameOffset = info.nameOffset;
-        element.documentationComment = info.documentationComment;
-      },
-    );
+    _applyToConstructors(element.constructors, info.constructors);
+    _applyToFields(element.fields, info.fields);
+    _applyToAccessors(element.accessors, info.accessors);
+    _applyToMethods(element.methods, info.methods);
 
     var linkedData = element.linkedData as EnumElementLinkedData;
     linkedData.applyConstantOffsets = ApplyConstantOffsets(
       info.constantOffsets,
       (applier) {
         applier.applyToMetadata(element);
-        applier.applyToEnumConstants(element.constants);
+        applier.applyToTypeParameters(element.typeParameters);
       },
     );
   }
@@ -770,65 +764,6 @@
   });
 }
 
-class _InfoEnumConstantDeclaration {
-  final int codeOffset;
-  final int codeLength;
-  final int nameOffset;
-  final String? documentationComment;
-
-  factory _InfoEnumConstantDeclaration(SummaryDataReader reader) {
-    return _InfoEnumConstantDeclaration._(
-      codeOffset: reader.readUInt30(),
-      codeLength: reader.readUInt30(),
-      nameOffset: reader.readUInt30(),
-      documentationComment: reader.readStringUtf8().nullIfEmpty,
-    );
-  }
-
-  _InfoEnumConstantDeclaration._({
-    required this.codeOffset,
-    required this.codeLength,
-    required this.nameOffset,
-    required this.documentationComment,
-  });
-}
-
-class _InfoEnumDeclaration {
-  final int codeOffset;
-  final int codeLength;
-  final int nameOffset;
-  final String? documentationComment;
-  final List<_InfoTypeParameter> typeParameters;
-  final List<_InfoEnumConstantDeclaration> constants;
-  final Uint32List constantOffsets;
-
-  factory _InfoEnumDeclaration(SummaryDataReader reader) {
-    return _InfoEnumDeclaration._(
-      codeOffset: reader.readUInt30(),
-      codeLength: reader.readUInt30(),
-      nameOffset: reader.readUInt30(),
-      documentationComment: reader.readStringUtf8().nullIfEmpty,
-      typeParameters: reader.readTypedList(
-        () => _InfoTypeParameter(reader),
-      ),
-      constants: reader.readTypedList(
-        () => _InfoEnumConstantDeclaration(reader),
-      ),
-      constantOffsets: reader.readUInt30List(),
-    );
-  }
-
-  _InfoEnumDeclaration._({
-    required this.codeOffset,
-    required this.codeLength,
-    required this.nameOffset,
-    required this.documentationComment,
-    required this.typeParameters,
-    required this.constants,
-    required this.constantOffsets,
-  });
-}
-
 class _InfoExport {
   final int nameOffset;
   final List<_InfoCombinator> combinators;
@@ -1173,15 +1108,14 @@
       sink.writeUInt30(node.name.offset);
       _writeDocumentationComment(node);
       _writeTypeParameters(node.typeParameters);
-      sink.writeList2<EnumConstantDeclaration>(node.constants, (node) {
-        sink.writeUInt30(node.offset);
-        sink.writeUInt30(node.length);
-        sink.writeUInt30(node.name.offset);
-        _writeDocumentationComment(node);
-      });
+      _writeConstructors(node.members);
+      _writeEnumFields(node.constants, node.members);
+      _writeGettersSetters(node.members);
+      _writeMethods(node.members);
       _writeOffsets(
         metadata: node.metadata,
         enumConstants: node.constants,
+        typeParameters: node.typeParameters,
       );
     });
 
@@ -1342,27 +1276,57 @@
     sink.writeStringUtf8(commentText ?? '');
   }
 
+  void _writeEnumFields(
+    List<EnumConstantDeclaration> constants,
+    List<ClassMember> members,
+  ) {
+    var fields = members
+        .whereType<FieldDeclaration>()
+        .expand((declaration) => declaration.fields.variables)
+        .toList();
+
+    sink.writeUInt30(constants.length + fields.length);
+
+    // Write constants in the same format as fields.
+    for (var node in constants) {
+      var codeOffset = node.offset;
+      sink.writeUInt30(codeOffset);
+      sink.writeUInt30(node.end - codeOffset);
+      sink.writeUInt30(node.name.offset);
+      _writeDocumentationComment(node);
+      _writeOffsets(
+        metadata: node.metadata,
+      );
+    }
+
+    for (var field in fields) {
+      _writeField(field);
+    }
+  }
+
+  void _writeField(VariableDeclaration node) {
+    var codeOffset = _codeOffsetForVariable(node);
+    sink.writeUInt30(codeOffset);
+    sink.writeUInt30(node.end - codeOffset);
+    sink.writeUInt30(node.name.offset);
+    _writeDocumentationComment(node);
+
+    // TODO(scheglov) Replace with some kind of double-iterating list.
+    var declaration = node.parent!.parent as FieldDeclaration;
+
+    _writeOffsets(
+      metadata: declaration.metadata,
+      constantInitializer: node.initializer,
+    );
+  }
+
   void _writeFields(List<ClassMember> members) {
     sink.writeList<VariableDeclaration>(
       members
           .whereType<FieldDeclaration>()
           .expand((declaration) => declaration.fields.variables)
           .toList(),
-      (node) {
-        var codeOffset = _codeOffsetForVariable(node);
-        sink.writeUInt30(codeOffset);
-        sink.writeUInt30(node.end - codeOffset);
-        sink.writeUInt30(node.name.offset);
-        _writeDocumentationComment(node);
-
-        // TODO(scheglov) Replace with some kind of double-iterating list.
-        var declaration = node.parent!.parent as FieldDeclaration;
-
-        _writeOffsets(
-          metadata: declaration.metadata,
-          constantInitializer: node.initializer,
-        );
-      },
+      _writeField,
     );
   }
 
@@ -1603,7 +1567,7 @@
   final List<_InfoPart> parts;
   final List<_InfoClassDeclaration> classDeclarations;
   final List<_InfoClassTypeAlias> classTypeAliases;
-  final List<_InfoEnumDeclaration> enums;
+  final List<_InfoClassDeclaration> enums;
   final List<_InfoClassDeclaration> extensions;
   final List<_InfoMethodDeclaration> accessors;
   final List<_InfoFunctionDeclaration> functions;
@@ -1636,7 +1600,7 @@
         () => _InfoClassTypeAlias(reader),
       ),
       enums: reader.readTypedList(
-        () => _InfoEnumDeclaration(reader),
+        () => _InfoClassDeclaration(reader),
       ),
       extensions: reader.readTypedList(
         () => _InfoClassDeclaration(reader, nameOffsetDelta: 1),
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index 75a6db5..8535a39 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -172,31 +172,31 @@
       }
     }
 
+    void findInClasses(List<ClassElement> classes) {
+      for (var class_ in classes) {
+        findInExecutables(class_.accessors);
+        findInExecutables(class_.constructors);
+        findInExecutables(class_.methods);
+      }
+    }
+
     findInExecutables(unitElement.accessors);
     findInExecutables(unitElement.functions);
 
-    for (var alias in unitElement.typeAliases) {
-      var aliasedElement = alias.aliasedElement;
-      if (aliasedElement is GenericFunctionTypeElement) {
-        findIn(aliasedElement.parameters);
-      }
-    }
+    findInClasses(unitElement.classes);
+    findInClasses(unitElement.enums);
+    findInClasses(unitElement.mixins);
 
     for (var extension_ in unitElement.extensions) {
       findInExecutables(extension_.accessors);
       findInExecutables(extension_.methods);
     }
 
-    for (var mixin in unitElement.mixins) {
-      findInExecutables(mixin.accessors);
-      findInExecutables(mixin.constructors);
-      findInExecutables(mixin.methods);
-    }
-
-    for (var class_ in unitElement.classes) {
-      findInExecutables(class_.accessors);
-      findInExecutables(class_.constructors);
-      findInExecutables(class_.methods);
+    for (var alias in unitElement.typeAliases) {
+      var aliasedElement = alias.aliasedElement;
+      if (aliasedElement is GenericFunctionTypeElement) {
+        findIn(aliasedElement.parameters);
+      }
     }
 
     unit.accept(
@@ -285,6 +285,10 @@
       findInClass(class_);
     }
 
+    for (var enum_ in unitElement.enums) {
+      findInClass(enum_);
+    }
+
     for (var extension_ in unitElement.extensions) {
       findIn(extension_.typeParameters);
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
index 7d2c061..89c6d3f 100644
--- a/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/context_collection_resolution.dart
@@ -258,6 +258,7 @@
 
   List<String> get experiments => [
         EnableString.constructor_tearoffs,
+        EnableString.enhanced_enums,
         EnableString.named_arguments_anywhere,
         EnableString.super_parameters,
       ];
diff --git a/pkg/analyzer/test/src/dart/resolution/enum_test.dart b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
index 1fbf4d9..7fe267d 100644
--- a/pkg/analyzer/test/src/dart/resolution/enum_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/enum_test.dart
@@ -41,6 +41,37 @@
     expect(findElement.field('values').isEnumConstant, isFalse);
   }
 
+  test_method() async {
+    await assertNoErrorsInCode(r'''
+enum E<T> {
+  v;
+  int foo<U>(T t, U u) => 0;
+}
+''');
+
+    assertNamedType(
+      findNode.namedType('T t'),
+      findElement.typeParameter('T'),
+      'T',
+    );
+
+    assertNamedType(
+      findNode.namedType('U u'),
+      findElement.typeParameter('U'),
+      'U',
+    );
+
+    assertSimpleFormalParameter(
+      findNode.simpleFormalParameter('T t'),
+      element: findElement.parameter('t'),
+    );
+
+    assertSimpleFormalParameter(
+      findNode.simpleFormalParameter('U u'),
+      element: findElement.parameter('u'),
+    );
+  }
+
   test_value_underscore() async {
     await assertNoErrorsInCode(r'''
 enum E { _ }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 6a27317..35aaf17 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -704,6 +704,13 @@
     assertType(node.staticType, type);
   }
 
+  void assertSimpleFormalParameter(
+    SimpleFormalParameter node, {
+    required ParameterElement element,
+  }) {
+    assertElement(node.declaredElement, element);
+  }
+
   void assertSimpleIdentifier(
     Expression node, {
     required Object? element,
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 5c069d3..ac4593d 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -17582,6 +17582,98 @@
 ''');
   }
 
+  test_enum_method() async {
+    var library = await checkLibrary(r'''
+enum E<T> {
+  v;
+  int foo<U>(T t, U u) => 0;
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @5
+        typeParameters
+          covariant T @7
+            defaultType: dynamic
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @14
+            type: E<dynamic>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: ConstructorMember
+                      base: self::@enum::E::@constructor::_
+                      substitution: {T: dynamic}
+                    staticType: null
+                    token: _ @-1
+                  period: . @0
+                  staticElement: ConstructorMember
+                    base: self::@enum::E::@constructor::_
+                    substitution: {T: dynamic}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<dynamic>
+                staticType: E<dynamic>
+          synthetic static const values @-1
+            type: List<E<dynamic>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<dynamic>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<dynamic>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<dynamic>
+          synthetic static get values @-1
+            returnType: List<E<dynamic>>
+        methods
+          foo @23
+            typeParameters
+              covariant U @27
+            parameters
+              requiredPositional t @32
+                type: T
+              requiredPositional u @37
+                type: U
+            returnType: int
+          synthetic toString @-1
+            returnType: String
+''');
+  }
+
   test_enum_typeParameters() async {
     var library = await checkLibrary('''
 enum E<T> {
@@ -28640,6 +28732,107 @@
 ''');
   }
 
+  test_metadata_typeParameter_ofEnum() async {
+    var library = await checkLibrary('''
+const a = 42;
+enum E<@a T> {
+  v
+}
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    enums
+      enum E @19
+        typeParameters
+          covariant T @24
+            defaultType: dynamic
+            metadata
+              Annotation
+                atSign: @ @21
+                element: <null>
+                name: SimpleIdentifier
+                  staticElement: <null>
+                  staticType: null
+                  token: a @22
+        supertype: Enum
+        fields
+          synthetic final index @-1
+            type: int
+          static const enumConstant v @31
+            type: E<dynamic>
+            constantInitializer
+              InstanceCreationExpression
+                argumentList: ArgumentList
+                  arguments
+                    IntegerLiteral
+                      literal: 0 @0
+                      staticType: int
+                    SimpleStringLiteral
+                      literal: 'v' @0
+                  leftParenthesis: ( @0
+                  rightParenthesis: ) @0
+                constructorName: ConstructorName
+                  name: SimpleIdentifier
+                    staticElement: ConstructorMember
+                      base: self::@enum::E::@constructor::_
+                      substitution: {T: dynamic}
+                    staticType: null
+                    token: _ @-1
+                  period: . @0
+                  staticElement: ConstructorMember
+                    base: self::@enum::E::@constructor::_
+                    substitution: {T: dynamic}
+                  type: NamedType
+                    name: SimpleIdentifier
+                      staticElement: self::@enum::E
+                      staticType: null
+                      token: E @-1
+                    type: E<dynamic>
+                staticType: E<dynamic>
+          synthetic static const values @-1
+            type: List<E<dynamic>>
+            constantInitializer
+              ListLiteral
+                elements
+                  SimpleIdentifier
+                    staticElement: self::@enum::E::@getter::v
+                    staticType: E<dynamic>
+                    token: v @-1
+                leftBracket: [ @0
+                rightBracket: ] @0
+                staticType: List<E<dynamic>>
+        constructors
+          synthetic const _ @-1
+            parameters
+              requiredPositional final this.index @-1
+                type: int
+                field: self::@enum::E::@field::index
+              requiredPositional name @-1
+                type: String
+        accessors
+          synthetic get index @-1
+            returnType: int
+          synthetic static get v @-1
+            returnType: E<dynamic>
+          synthetic static get values @-1
+            returnType: List<E<dynamic>>
+        methods
+          synthetic toString @-1
+            returnType: String
+    topLevelVariables
+      static const a @6
+        type: int
+        constantInitializer
+          IntegerLiteral
+            literal: 42 @10
+            staticType: int
+    accessors
+      synthetic static get a @-1
+        returnType: int
+''');
+  }
+
   test_metadata_typeParameter_ofFunction() async {
     var library = await checkLibrary('const a = null; f<@a T>() {}');
     checkElementText(library, r'''
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 8a49df4..d8ec77f 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -1359,7 +1359,7 @@
   // file and expanding them into the resulting argument list.
   //
   // TODO: Move this logic to a single place and share it among all tools.
-  if (arguments.last.startsWith('@')) {
+  if (arguments.length > 0 && arguments.last.startsWith('@')) {
     var extra = _readLines(arguments.last.substring(1));
     arguments = arguments.take(arguments.length - 1).followedBy(extra).toList();
   }
diff --git a/tools/VERSION b/tools/VERSION
index 1a53903..b5e4760 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 18
+PRERELEASE 19
 PRERELEASE_PATCH 0
\ No newline at end of file
