diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index 9238540..7dfad22 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// @dart = 2.10
-
 library dart2js.js.enqueue;
 
 import 'dart:collection' show Queue;
@@ -16,7 +14,7 @@
 import '../elements/types.dart';
 import '../enqueue.dart';
 import '../js_backend/annotations.dart';
-import '../universe/codegen_world_builder.dart';
+import '../universe/codegen_world_builder_interfaces.dart';
 import '../universe/member_usage.dart';
 import '../universe/use.dart'
     show
@@ -34,7 +32,7 @@
   final String name;
   final Set<ClassEntity> _recentClasses = Setlet();
   bool _recentConstants = false;
-  final CodegenWorldBuilderImpl worldBuilder;
+  final CodegenWorldBuilderImplForEnqueuer worldBuilder;
   final WorkItemBuilder _workItemBuilder;
 
   @override
@@ -52,7 +50,7 @@
 
   // If not `null` this is called when the queue has been emptied. It allows for
   // applying additional impacts before re-emptying the queue.
-  void Function() onEmptyForTesting;
+  void Function()? onEmptyForTesting;
 
   CodegenEnqueuer(this.task, this.worldBuilder, this._workItemBuilder,
       this.listener, this._annotationsData)
@@ -77,7 +75,7 @@
   void _addToWorkList(MemberEntity entity) {
     if (_processedEntities.contains(entity)) return;
 
-    WorkItem workItem = _workItemBuilder.createWorkItem(entity);
+    final workItem = _workItemBuilder.createWorkItem(entity);
     if (workItem == null) return;
 
     if (queueIsClosed) {
@@ -134,7 +132,7 @@
       _addToWorkList(member);
     }
     if (useSet.contains(MemberUse.CLOSURIZE_INSTANCE)) {
-      _registerClosurizedMember(member);
+      _registerClosurizedMember(member as FunctionEntity);
     }
     if (useSet.contains(MemberUse.CLOSURIZE_STATIC)) {
       applyImpact(listener.registerGetOfStaticFunction());
@@ -149,17 +147,17 @@
   }
 
   @override
-  void processStaticUse(MemberEntity member, StaticUse staticUse) {
+  void processStaticUse(MemberEntity? member, StaticUse staticUse) {
     task.measureSubtask('codegen.staticUse', () {
       worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
       switch (staticUse.kind) {
         case StaticUseKind.CONSTRUCTOR_INVOKE:
         case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
-          processTypeUse(member, TypeUse.instantiation(staticUse.type));
+          processTypeUse(member, TypeUse.instantiation(staticUse.type!));
           break;
         case StaticUseKind.INLINING:
           // TODO(johnniwinther): Should this be tracked with _MemberUsage ?
-          listener.registerUsedElement(staticUse.element);
+          listener.registerUsedElement(staticUse.element as MemberEntity);
           break;
         default:
           break;
@@ -168,14 +166,14 @@
   }
 
   @override
-  void processTypeUse(MemberEntity member, TypeUse typeUse) {
+  void processTypeUse(MemberEntity? member, TypeUse typeUse) {
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
-        _registerInstantiatedType(type);
+        _registerInstantiatedType(type as InterfaceType);
         break;
       case TypeUseKind.NATIVE_INSTANTIATION:
-        _registerInstantiatedType(type, nativeUsage: true);
+        _registerInstantiatedType(type as InterfaceType, nativeUsage: true);
         break;
       case TypeUseKind.IS_CHECK:
       case TypeUseKind.CATCH_TYPE:
@@ -209,14 +207,13 @@
         worldBuilder.registerTypeArgument(type);
         break;
       case TypeUseKind.CONSTRUCTOR_REFERENCE:
-        worldBuilder.registerConstructorReference(type);
+        worldBuilder.registerConstructorReference(type as InterfaceType);
         break;
       case TypeUseKind.CONST_INSTANTIATION:
         failedAt(CURRENT_ELEMENT_SPANNABLE, "Unexpected type use: $typeUse.");
-        break;
       case TypeUseKind.NAMED_TYPE_VARIABLE_NEW_RTI:
-        assert(type is TypeVariableType);
-        _registerNamedTypeVariableNewRti(type);
+        _registerNamedTypeVariableNewRti(type as TypeVariableType);
+        break;
     }
   }
 
@@ -267,7 +264,7 @@
   void forEach(void f(WorkItem work)) {
     _forEach(f);
     if (onEmptyForTesting != null) {
-      onEmptyForTesting();
+      onEmptyForTesting!();
       _forEach(f);
     }
   }
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder.dart b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
index 73a25f6..9ddc907 100644
--- a/pkg/compiler/lib/src/universe/codegen_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder.dart
@@ -21,6 +21,7 @@
 import '../util/util.dart';
 import '../world.dart';
 import 'call_structure.dart';
+import 'codegen_world_builder_interfaces.dart' as interfaces;
 import 'member_usage.dart';
 import 'selector.dart' show Selector;
 import 'use.dart'
@@ -30,7 +31,8 @@
 /// World builder specific to codegen.
 ///
 /// This adds additional access to liveness of selectors and elements.
-abstract class CodegenWorldBuilder {
+abstract class CodegenWorldBuilder
+    implements interfaces.CodegenWorldBuilderImplForEnqueuer {
   /// Register [constant] as needed for emission.
   void addCompileTimeConstantForEmission(ConstantValue constant);
 
@@ -172,6 +174,7 @@
       .where((cls) => _processedClasses[cls].isInstantiated);
 
   // TODO(johnniwinther): Improve semantic precision.
+  @override
   Iterable<ClassEntity> get directlyInstantiatedClasses {
     return _directlyInstantiatedClasses;
   }
@@ -180,6 +183,7 @@
   // TODO(johnniwinther): Fully enforce the separation between exact, through
   // subclass and through subtype instantiated types/classes.
   // TODO(johnniwinther): Support unknown type arguments for generic types.
+  @override
   void registerTypeInstantiation(
       InterfaceType type, ClassUsedCallback classUsed) {
     ClassEntity cls = type.element;
@@ -251,6 +255,7 @@
         _invokedSetters[member.name], member, _closedWorld);
   }
 
+  @override
   void registerDynamicUse(
       DynamicUse dynamicUse, MemberUsedCallback memberUsed) {
     Selector selector = dynamicUse.selector;
@@ -319,14 +324,17 @@
     return constraints.addReceiverConstraint(constraint);
   }
 
+  @override
   void registerIsCheck(covariant DartType type) {
     _isChecks.add(type);
   }
 
+  @override
   void registerNamedTypeVariableNewRti(TypeVariableType type) {
     _namedTypeVariablesNewRti.add(type);
   }
 
+  @override
   void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed) {
     MemberEntity element = staticUse.element;
     EnumSet<MemberUse> useSet = EnumSet();
@@ -409,6 +417,7 @@
     }
   }
 
+  @override
   void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
       {bool checkEnqueuerConsistency = false}) {
     _elementEnvironment.forEachClassMember(cls,
@@ -559,19 +568,23 @@
 
   /// Register the constant [use] with this world builder. Returns `true` if
   /// the constant use was new to the world.
+  @override
   bool registerConstantUse(ConstantUse use) {
     addCompileTimeConstantForEmission(use.value);
     return _constantValues.add(use.value);
   }
 
+  @override
   void registerConstTypeLiteral(DartType type) {
     _constTypeLiterals.add(type);
   }
 
+  @override
   void registerTypeArgument(DartType type) {
     _liveTypeArguments.add(type);
   }
 
+  @override
   void registerConstructorReference(InterfaceType type) {
     _constructorReferences.add(type.element);
   }
diff --git a/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart b/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart
new file mode 100644
index 0000000..65499cf
--- /dev/null
+++ b/pkg/compiler/lib/src/universe/codegen_world_builder_interfaces.dart
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../elements/entities.dart';
+import '../elements/types.dart';
+import '../universe/use.dart';
+import 'member_usage.dart';
+
+abstract class CodegenWorldBuilderImplForEnqueuer {
+  Iterable<ClassEntity> get directlyInstantiatedClasses;
+
+  void registerTypeInstantiation(
+      InterfaceType type, ClassUsedCallback classUsed);
+
+  void processClassMembers(ClassEntity cls, MemberUsedCallback memberUsed,
+      {bool checkEnqueuerConsistency = false});
+
+  void registerDynamicUse(DynamicUse dynamicUse, MemberUsedCallback memberUsed);
+
+  void registerStaticUse(StaticUse staticUse, MemberUsedCallback memberUsed);
+
+  void registerTypeVariableTypeLiteral(TypeVariableType typeVariable);
+
+  void registerConstTypeLiteral(DartType type);
+
+  void registerTypeArgument(DartType type);
+
+  void registerConstructorReference(InterfaceType type);
+
+  bool registerConstantUse(ConstantUse use);
+
+  void registerIsCheck(covariant DartType type);
+
+  void registerNamedTypeVariableNewRti(TypeVariableType type);
+}
