diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index da84cb3..e225449 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -28,7 +28,6 @@
 import '../options.dart';
 import '../util/sink_adapter.dart';
 import '../world.dart';
-import 'deferrable.dart';
 import 'serialization.dart';
 
 /// A data class holding some data [T] and the associated [DataSourceIndices].
@@ -341,7 +340,7 @@
       sink.writeMemberMap(
           results,
           (MemberEntity member, CodegenResult result) =>
-              sink.writeDeferrable(() => result.writeToDataSink(sink)));
+              result.writeToDataSink(sink));
       sink.close();
     });
   }
@@ -354,7 +353,7 @@
       bool useDeferredSourceReads) async {
     int shards = _options.codegenShards;
     JClosedWorld closedWorld = globalTypeInferenceResults.closedWorld;
-    Map<MemberEntity, Deferrable<CodegenResult>> results = {};
+    Map<MemberEntity, CodegenResult> results = {};
     for (int shard = 0; shard < shards; shard++) {
       Uri uri = Uri.parse('${_options.readCodegenUri}$shard');
       await measureIoSubtask('deserialize codegen', () async {
@@ -369,7 +368,7 @@
       });
     }
     return DeserializedCodegenResults(
-        globalTypeInferenceResults, codegenInputs, DeferrableValueMap(results));
+        globalTypeInferenceResults, codegenInputs, results);
   }
 
   void _deserializeCodegenInput(
@@ -378,7 +377,7 @@
       Uri uri,
       api.Input<List<int>> dataInput,
       DataSourceIndices importedIndices,
-      Map<MemberEntity, Deferrable<CodegenResult>> results,
+      Map<MemberEntity, CodegenResult> results,
       bool useDeferredSourceReads) {
     DataSourceReader source = DataSourceReader(
         BinaryDataSource(dataInput.data, stringInterner: _stringInterner),
@@ -387,19 +386,17 @@
         importedIndices: importedIndices,
         useDeferredStrategy: useDeferredSourceReads);
     backendStrategy.prepareCodegenReader(source);
-    Map<MemberEntity, Deferrable<CodegenResult>> codegenResults =
+    Map<MemberEntity, CodegenResult> codegenResults =
         source.readMemberMap((MemberEntity member) {
-      return source.readDeferrable(() {
-        List<ModularName> modularNames = [];
-        List<ModularExpression> modularExpressions = [];
-        CodegenReader reader =
-            CodegenReaderImpl(closedWorld, modularNames, modularExpressions);
-        source.registerCodegenReader(reader);
-        CodegenResult result = CodegenResult.readFromDataSource(
-            source, modularNames, modularExpressions);
-        source.deregisterCodegenReader(reader);
-        return result;
-      });
+      List<ModularName> modularNames = [];
+      List<ModularExpression> modularExpressions = [];
+      CodegenReader reader =
+          CodegenReaderImpl(closedWorld, modularNames, modularExpressions);
+      source.registerCodegenReader(reader);
+      CodegenResult result = CodegenResult.readFromDataSource(
+          source, modularNames, modularExpressions);
+      source.deregisterCodegenReader(reader);
+      return result;
     });
     _reporter.log('Read ${codegenResults.length} members from ${uri}');
     results.addAll(codegenResults);
