Deletes POLYMORPHIC strategy. ObjectCodec now uses runtime type information to select a codec.

PiperOrigin-RevId: 186378153
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index 4844dc9..6b9d374 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -29,9 +29,6 @@
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -70,10 +67,7 @@
           + "applicable for certain kinds of actions. Fields that are inapplicable are set to "
           + "<code>None</code>."
 )
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public abstract class AbstractAction implements Action, SkylarkValue {
-  public static final ObjectCodec<AbstractAction> CODEC = new AbstractAction_AutoCodec();
-
   /**
    * An arbitrary default resource set. Currently 250MB of memory, 50% CPU and 0% of total I/O.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java
index 54f562a..0111313 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Action.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java
@@ -17,9 +17,6 @@
 import com.google.devtools.build.lib.actions.extra.ExtraActionInfo;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ConditionallyThreadCompatible;
 import com.google.devtools.build.lib.profiler.Describable;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -79,10 +76,7 @@
  * known set of fields is covered, not that all fields are covered), so carefully check all changes
  * to action subclasses.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface Action extends ActionExecutionMetadata, Describable {
-  public static final ObjectCodec<Action> CODEC = new Action_AutoCodec();
-
   /**
    * Prepares for executing this action; called by the Builder prior to executing the Action itself.
    * This method should prepare the file system, so that the execution of the Action can write the
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
index 33555a2..8ed14d1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
@@ -23,9 +23,6 @@
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
 import java.util.ArrayList;
@@ -191,11 +188,7 @@
    * subclasses of ActionLookupKey. This allows callers to easily find the value key, while
    * remaining agnostic to what ActionLookupValues actually exist.
    */
-  @AutoCodec(strategy = Strategy.POLYMORPHIC)
   public abstract static class ActionLookupKey implements ArtifactOwner, SkyKey {
-    public static final ObjectCodec<ActionLookupKey> CODEC =
-        new ActionLookupValue_ActionLookupKey_AutoCodec();
-
     @Override
     public Label getLabel() {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
index 27b97a4..36f7b24 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactOwner.java
@@ -15,7 +15,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
@@ -23,10 +22,7 @@
  * internal {@link Artifact}-generators should implement this interface -- otherwise, {@code
  * ActionLookupKey} and its subclasses should be the only implementation.
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface ArtifactOwner {
-  ObjectCodec<ArtifactOwner> CODEC = new ArtifactOwner_AutoCodec();
-
   Label getLabel();
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java
index 4e9a079..f033754 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java
@@ -15,15 +15,11 @@
 package com.google.devtools.build.lib.actions;
 
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
  * An interface for {@code BuildConfiguration} that only exists so that {@link ActionOwner} can
  * refer to {@code BuildConfiguration}, which is in a dependent package. {@code BuildConfiguration}
  * must be the only implementation of this interface.
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface BuildConfigurationInterface extends BuildEvent {
-  ObjectCodec<BuildConfigurationInterface> CODEC = new BuildConfigurationInterface_AutoCodec();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/CommandLine.java b/src/main/java/com/google/devtools/build/lib/actions/CommandLine.java
index f14af97..558644b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/CommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/CommandLine.java
@@ -21,15 +21,11 @@
 import com.google.devtools.build.lib.collect.CollectionUtils;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.util.Fingerprint;
 
 /** A representation of a list of arguments. */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public abstract class CommandLine {
-  public static final ObjectCodec<CommandLine> CODEC = new CommandLine_AutoCodec();
-
   @AutoCodec
   @VisibleForSerialization
   static class EmptyCommandLine extends CommandLine {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
index e6cb1bf..57272bd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/LicensesProvider.java
@@ -21,14 +21,10 @@
 import com.google.devtools.build.lib.packages.License;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import java.util.Objects;
 
 /** A {@link ConfiguredTarget} that has licensed targets in its transitive closure. */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface LicensesProvider extends TransitiveInfoProvider {
-  ObjectCodec<LicensesProvider> CODEC = new LicensesProvider_AutoCodec();
-
   /**
    * The set of label - license associations in the transitive closure.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 3e4011d..933a1a8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -230,9 +230,7 @@
    * Interface used for adding empty files to the runfiles at the last minute. Mainly to support
    * python-related rules adding __init__.py files.
    */
-  @AutoCodec(strategy = Strategy.POLYMORPHIC)
   public interface EmptyFilesSupplier {
-    ObjectCodec<EmptyFilesSupplier> CODEC = new Runfiles_EmptyFilesSupplier_AutoCodec();
     /** Calculate additional empty files to add based on the existing manifest paths. */
     Iterable<PathFragment> getExtraPaths(Set<PathFragment> manifestPaths);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
index baa0690..7bf46dc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/VisibilityProvider.java
@@ -16,15 +16,9 @@
 
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.PackageSpecification.PackageGroupContents;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 
 /** Provider class for configured targets that have a visibility. */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface VisibilityProvider extends TransitiveInfoProvider {
-  ObjectCodec<VisibilityProvider> CODEC = new VisibilityProvider_AutoCodec();
-
   /** Returns the visibility specification. */
   NestedSet<PackageGroupContents> getVisibility();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 3f2a463..3bec3da 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -139,10 +139,7 @@
    * declare {@link ImmutableList} signatures on their interfaces vs. {@link List}). This is because
    * fragment instances may be shared across configurations.
    */
-  @AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
   public abstract static class Fragment {
-    public static final ObjectCodec<Fragment> CODEC = new BuildConfiguration_Fragment_AutoCodec();
-
     /**
      * Validates the options for this Fragment. Issues warnings for the
      * use of deprecated options, and warnings or errors for any option settings
@@ -2146,7 +2143,7 @@
       BlazeDirectories.CODEC.serialize(context, obj.directories, codedOut);
       codedOut.writeInt32NoTag(obj.fragments.size());
       for (Fragment fragment : obj.fragments.values()) {
-        Fragment.CODEC.serialize(context, fragment, codedOut);
+        context.serialize(fragment, codedOut);
       }
       BuildOptions.CODEC.serialize(context, obj.buildOptions, codedOut);
       StringCodecs.asciiOptimized().serialize(context, obj.repositoryName, codedOut);
@@ -2160,7 +2157,7 @@
       ImmutableSortedMap.Builder<Class<? extends Fragment>, Fragment> builder =
           new ImmutableSortedMap.Builder<>(lexicalFragmentSorter);
       for (int i = 0; i < length; ++i) {
-        Fragment fragment = Fragment.CODEC.deserialize(context, codedIn);
+        Fragment fragment = context.deserialize(codedIn);
         builder.put(fragment.getClass(), fragment);
       }
       BuildOptions options = BuildOptions.CODEC.deserialize(context, codedIn);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
index 4a89121..cd1db7c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
@@ -345,7 +345,7 @@
       Collection<FragmentOptions> fragmentOptions = buildOptions.getOptions();
       codedOut.writeInt32NoTag(fragmentOptions.size());
       for (FragmentOptions options : buildOptions.getOptions()) {
-        FragmentOptions.CODEC.serialize(context, options, codedOut);
+        context.serialize(options, codedOut);
       }
     }
 
@@ -355,7 +355,7 @@
       BuildOptions.Builder builder = BuildOptions.builder();
       int length = codedIn.readInt32();
       for (int i = 0; i < length; ++i) {
-        builder.add(FragmentOptions.CODEC.deserialize(context, codedIn));
+        builder.add(context.deserialize(codedIn));
       }
       return builder.build();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentOptions.java
index 305a95e..abf15c5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/FragmentOptions.java
@@ -17,8 +17,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsBase;
 import java.io.Serializable;
@@ -26,10 +24,7 @@
 import java.util.Set;
 
 /** Command-line build options for a Blaze module. */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public abstract class FragmentOptions extends OptionsBase implements Cloneable, Serializable {
-  public static final ObjectCodec<FragmentOptions> CODEC = new FragmentOptions_AutoCodec();
-
   /**
    * Returns the labels contributed to the defaults package by this fragment.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnder.java b/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnder.java
index 349c62b..5848f5b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/RunUnder.java
@@ -14,16 +14,11 @@
 package com.google.devtools.build.lib.analysis.config;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import java.io.Serializable;
 import java.util.List;
 
 /** Components of --run_under option. */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface RunUnder extends Serializable {
-  public static final ObjectCodec<RunUnder> CODEC = new RunUnder_AutoCodec();
-
   /**
    * @return the whole value passed to --run_under option.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
index 3c60f8e..d0f4017 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
@@ -16,14 +16,11 @@
 
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 
 /**
  * An abstract class for adding a Skylark API for the native providers. Derived classes should
  * declare functions to be used from Skylark.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public abstract class SkylarkApiProvider {
   private TransitiveInfoCollection info;
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java
index 8ef3e5b..4fdc499 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java
@@ -17,16 +17,10 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.util.Pair;
 
 /** A provider of instrumented file sources and instrumentation metadata. */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface InstrumentedFilesProvider extends TransitiveInfoProvider {
-  ObjectCodec<InstrumentedFilesProvider> CODEC = new InstrumentedFilesProvider_AutoCodec();
-
   /**
    * The transitive closure of instrumented source files.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/events/Location.java b/src/main/java/com/google/devtools/build/lib/events/Location.java
index 412d601..e6cc8de 100644
--- a/src/main/java/com/google/devtools/build/lib/events/Location.java
+++ b/src/main/java/com/google/devtools/build/lib/events/Location.java
@@ -16,7 +16,6 @@
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -33,10 +32,7 @@
  * attribute access, as far more Locations are created during parsing than are ever used to display
  * error messages.
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public abstract class Location implements Serializable {
-  public static final ObjectCodec<Location> CODEC = new Location_AutoCodec();
-
   @AutoCodec
   @Immutable
   static final class LocationWithPathAndStartColumn extends Location {
@@ -302,12 +298,11 @@
     }
   }
 
-  private static final class BuiltinLocation extends Location {
+  @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
+  @AutoCodec.VisibleForSerialization
+  static final class BuiltinLocation extends Location {
     public static final BuiltinLocation INSTANCE = new BuiltinLocation();
 
-    public static final ObjectCodec<BuiltinLocation> CODEC =
-        SingletonCodec.of(INSTANCE, "BuiltinLocation");
-
     private BuiltinLocation() {
       super(0, 0);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
index 66d661a..723736e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectClass.java
@@ -14,8 +14,6 @@
 
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
  * A class of aspects.
@@ -92,10 +90,7 @@
  * @see com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory
  * @see com.google.devtools.build.lib.skyframe.AspectFunction
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface AspectClass {
-  ObjectCodec<AspectClass> CODEC = new AspectClass_AutoCodec();
-
   /**
    * Returns an aspect name.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
index 2212224..f01efeb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSpecification.java
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.stream.Stream;
@@ -43,11 +42,7 @@
  * <p>A package specification is specific to a single {@link RepositoryName} unless it is the "all
  * packages" specification.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public abstract class PackageSpecification {
-  public static final ObjectCodec<PackageSpecification> CODEC =
-      new PackageSpecification_AutoCodec();
-
   private static final String PACKAGE_LABEL = "__pkg__";
   private static final String SUBTREE_LABEL = "__subpackages__";
   private static final String ALL_BENEATH_SUFFIX = "/...";
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/AspectLegalCppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/AspectLegalCppSemantics.java
index 19296b8..073d256 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/AspectLegalCppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/AspectLegalCppSemantics.java
@@ -14,16 +14,11 @@
 
 package com.google.devtools.build.lib.rules.cpp;
 
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /**
  * A marker for {@link CppSemantics} implementations that are legal as members of an aspect. These
  * implementations must not be heavy to serialize (e.g. a singleton is fine), so as not to weigh
  * down AspectKey.
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface AspectLegalCppSemantics extends CppSemantics {
-  public static final ObjectCodec<AspectLegalCppSemantics> CODEC =
-      new AspectLegalCppSemantics_AutoCodec();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java
index 71f9464..760b4cb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLinkParamsStore.java
@@ -18,7 +18,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcLinkParams.Builder;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 
 /**
@@ -47,10 +46,7 @@
  * }
  * </pre>
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public abstract class CcLinkParamsStore {
-  public static final ObjectCodec<CcLinkParamsStore> CODEC = new CcLinkParamsStore_AutoCodec();
-
   private CcLinkParams staticSharedParams;
   private CcLinkParams staticNoSharedParams;
   private CcLinkParams noStaticSharedParams;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
index 281f2d0..5664286 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainFeatures.java
@@ -40,7 +40,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -118,9 +117,7 @@
    * %{var1}/%{var2}"). We split the string into chunks, where each chunk represents either a text
    * snippet, or a variable that is to be replaced.
    */
-  @AutoCodec(strategy = Strategy.POLYMORPHIC)
   interface StringChunk {
-    ObjectCodec<StringChunk> CODEC = new CcToolchainFeatures_StringChunk_AutoCodec();
     /**
      * Expands this chunk.
      *
@@ -331,11 +328,7 @@
   }
 
   /** A flag or flag group that can be expanded under a set of variables. */
-  @AutoCodec(strategy = Strategy.POLYMORPHIC)
   interface Expandable {
-
-    ObjectCodec<Expandable> CODEC = new CcToolchainFeatures_Expandable_AutoCodec();
-
     /**
      * Expands the current expandable under the given {@code view}, adding new flags to {@code
      * commandLine}.
@@ -1207,11 +1200,7 @@
      * <p>Implementations must be immutable and without any side-effects. They will be expanded and
      * queried multiple times.
      */
-    @AutoCodec(strategy = Strategy.POLYMORPHIC)
     interface VariableValue {
-      ObjectCodec<VariableValue> CODEC =
-          new CcToolchainFeatures_Variables_VariableValue_AutoCodec();
-
       /**
        * Returns string value of the variable, if the variable type can be converted to string (e.g.
        * StringValue), or throw exception if it cannot (e.g. Sequence).
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
index 98f3356..614369f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppSemantics.java
@@ -18,14 +18,9 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration.HeadersCheckingMode;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 
 /** Pluggable C++ compilation semantics. */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface CppSemantics {
-  public static final ObjectCodec<CppSemantics> CODEC = new CppSemantics_AutoCodec();
-
   /**
    * Called before a C++ compile action is built.
    *
@@ -61,7 +56,7 @@
    * in the action graph.
    */
   boolean needsIncludeScanning(RuleContext ruleContext);
-  
+
   /** Returns true iff this build should perform .d input pruning. */
   boolean needsDotdInputPruning();
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
index 7b7238d..9c04dc9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtraLinkTimeLibrary.java
@@ -17,9 +17,6 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 
 /**
  * An extra library to include in a link. The actual library is built at link time.
@@ -31,10 +28,7 @@
  * <p>Any implementations must be immutable (and therefore thread-safe), because this is passed
  * between rules and accessed in a multi-threaded context.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface ExtraLinkTimeLibrary {
-  ObjectCodec<ExtraLinkTimeLibrary> CODEC = new ExtraLinkTimeLibrary_AutoCodec();
-
   /** Build the LibraryToLink inputs to pass to the C++ linker. */
   NestedSet<LibraryToLink> buildLibraries(RuleContext context) throws InterruptedException;
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java
index 6bd9589..e9721a5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeProcessing.java
@@ -18,16 +18,10 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ExecException;
 import com.google.devtools.build.lib.rules.cpp.IncludeScanner.IncludeScannerSupplier;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import javax.annotation.Nullable;
 
 /** Used as an interface to thin header inputs to compile actions for C++-like compiles. */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface IncludeProcessing {
-  ObjectCodec<IncludeProcessing> CODEC = new IncludeProcessing_AutoCodec();
-
   /** Performs include processing actions and returns the processed set of resulting headers. */
   Iterable<Artifact> determineAdditionalInputs(
       @Nullable IncludeScannerSupplier includeScannerSupplier,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java
index 71c9ce4..4c97495 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/IncludeScannable.java
@@ -16,9 +16,6 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collection;
 import java.util.List;
@@ -32,10 +29,7 @@
  * <p>This is useful for remote execution strategies to be able to compute the complete set of files
  * that must be distributed in order to execute such an action.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface IncludeScannable {
-  public static final ObjectCodec<IncludeScannable> CODEC = new IncludeScannable_AutoCodec();
-
   /**
    * Returns the built-in list of system include paths for the toolchain compiler. All paths in this
    * list should be relative to the exec directory. They may be absolute if they are also installed
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
index 818b9f9..3b0c361 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInput.java
@@ -15,19 +15,13 @@
 package com.google.devtools.build.lib.rules.cpp;
 
 import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 
 /**
  * Something that appears on the command line of the linker. Since we sometimes expand archive files
  * to their constituent object files, we need to keep information whether a certain file contains
  * embedded objects and if so, the list of the object files themselves.
  */
-@AutoCodec(strategy = Strategy.POLYMORPHIC)
 public interface LinkerInput {
-  ObjectCodec<LinkerInput> CODEC = new LinkerInput_AutoCodec();
-
   /**
    * Returns the type of the linker input.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
index 8432cdd..8625cf6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LinkerInputs.java
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 
 /**
@@ -149,11 +148,7 @@
    * A library the user can link to. This is different from a simple linker input in that it also
    * has a library identifier.
    */
-  @AutoCodec(strategy = Strategy.POLYMORPHIC)
   public interface LibraryToLink extends LinkerInput {
-    public static final ObjectCodec<LibraryToLink> CODEC =
-        new LinkerInputs_LibraryToLink_AutoCodec();
-
     ImmutableMap<Artifact, Artifact> getLtoBitcodeFiles();
 
     /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index a3a1e63..aac466b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -45,8 +45,6 @@
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaOptimizationMode;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration.OneVersionEnforcementLevel;
 import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -57,10 +55,7 @@
 import javax.annotation.Nullable;
 
 /** Pluggable Java compilation semantics. */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface JavaSemantics {
-  public static final ObjectCodec<JavaSemantics> CODEC = new JavaSemantics_AutoCodec();
-
   LibraryLanguage LANGUAGE = new LibraryLanguage("Java");
 
   SafeImplicitOutputsFunction JAVA_LIBRARY_CLASS_JAR =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
index be64706..777dcba 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
@@ -17,8 +17,7 @@
 import com.google.devtools.build.lib.actions.ActionLookupValue;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 
@@ -55,10 +54,9 @@
   }
 
   /** {@link SkyKey} for {@link WorkspaceStatusValue}. */
+  @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
   public static class BuildInfoKey extends ActionLookupKey {
-    private static final BuildInfoKey INSTANCE = new BuildInfoKey();
-    public static final ObjectCodec<BuildInfoKey> CODEC =
-        SingletonCodec.of(INSTANCE, "build_info_key");
+    @AutoCodec.VisibleForSerialization static final BuildInfoKey INSTANCE = new BuildInfoKey();
 
     private BuildInfoKey() {}
 
@@ -66,6 +64,5 @@
     public SkyFunctionName functionName() {
       return SkyFunctions.BUILD_INFO;
     }
-
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
deleted file mode 100644
index b199ca6..0000000
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/PolymorphicHelper.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.skyframe.serialization;
-
-import com.google.devtools.build.lib.skyframe.serialization.strings.StringCodecs;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Optional;
-import javax.annotation.Nullable;
-
-/** Helper methods for polymorphic codecs using reflection. */
-public class PolymorphicHelper {
-
-  private PolymorphicHelper() {}
-
-  /**
-   * Serializes a polymorphic type.
-   *
-   * @param dependency if null, it means that the parent, polymorphic type, provides no dependency.
-   *     It is valid for dependency to be non-null, with an enclosed null value. This means that
-   *     dependency itself is null (as opposed to non-existent).
-   */
-  @SuppressWarnings("unchecked")
-  public static void serialize(
-      SerializationContext context,
-      Object input,
-      Class<?> baseClass,
-      CodedOutputStream codedOut,
-      @Nullable Optional<?> dependency)
-      throws IOException, SerializationException {
-    if (input != null) {
-      try {
-        ClassAndCodec classAndCodec = getClassAndCodecInClassHierarchy(input, baseClass);
-        Class<?> clazz = classAndCodec.clazz;
-        Object codec = classAndCodec.codec;
-        codedOut.writeBoolNoTag(true);
-        StringCodecs.asciiOptimized().serialize(context, clazz.getName(), codedOut);
-        if (codec instanceof ObjectCodec) {
-          ((ObjectCodec) codec).serialize(context, input, codedOut);
-        } else {
-          throw new SerializationException(
-              clazz.getCanonicalName()
-                  + ".CODEC has unexpected type "
-                  + codec.getClass().getCanonicalName());
-        }
-      } catch (ReflectiveOperationException e) {
-        throw new SerializationException(input.getClass().getName(), e);
-      }
-    } else {
-      codedOut.writeBoolNoTag(false);
-    }
-  }
-
-  /**
-   * Deserializes a polymorphic type.
-   *
-   * @param dependency if null, it means that the parent, polymorphic type, provides no dependency.
-   *     It is valid for dependency to be non-null, with an enclosed null value. This means the
-   *     dependency itself is null (as opposed to non-existent).
-   */
-  @SuppressWarnings("unchecked")
-  public static Object deserialize(
-      DeserializationContext context, CodedInputStream codedIn, @Nullable Optional<?> dependency)
-      throws IOException, SerializationException {
-    Object deserialized = null;
-    if (codedIn.readBool()) {
-      String className = StringCodecs.asciiOptimized().deserialize(context, codedIn);
-      try {
-        Object codec = getCodec(Class.forName(className));
-        if (codec instanceof ObjectCodec) {
-          return ((ObjectCodec) codec).deserialize(context, codedIn);
-        } else {
-          throw new SerializationException(
-              className + ".CODEC has unexpected type " + codec.getClass().getCanonicalName());
-        }
-      } catch (ReflectiveOperationException e) {
-        throw new SerializationException(className, e);
-      }
-    }
-    return deserialized;
-  }
-
-  private static ClassAndCodec getClassAndCodecInClassHierarchy(Object input, Class<?> baseClass)
-      throws SerializationException, IllegalAccessException {
-    Class<?> clazz = input.getClass();
-    Field codecField = null;
-    while (!clazz.equals(baseClass)) {
-      try {
-        codecField = getCodecField(clazz);
-        break;
-      } catch (NoSuchFieldException e) {
-        clazz = clazz.getSuperclass();
-      }
-    }
-    if (clazz.equals(baseClass)) {
-      throw new SerializationException("Could not find codec for " + input.getClass());
-    }
-    return new ClassAndCodec(clazz, getValueOfField(codecField));
-  }
-
-  private static Field getCodecField(Class<?> clazz) throws NoSuchFieldException {
-    return clazz.getDeclaredField("CODEC");
-  }
-
-  private static Object getValueOfField(Field field) throws IllegalAccessException {
-    field.setAccessible(true);
-    return field.get(null);
-  }
-
-  /** Returns the static CODEC instance for {@code clazz}. */
-  private static Object getCodec(Class<?> clazz)
-      throws NoSuchFieldException, IllegalAccessException {
-    return getValueOfField(getCodecField(clazz));
-  }
-
-  private static class ClassAndCodec {
-    final Class<?> clazz;
-    final Object codec;
-
-    ClassAndCodec(Class<?> clazz, Object codec) {
-      this.clazz = clazz;
-      this.codec = codec;
-    }
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
index 0f597db..cb88b0a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodec.java
@@ -62,16 +62,6 @@
      */
     PUBLIC_FIELDS,
     /**
-     * For use with abstract classes (enforced at compile time).
-     *
-     * <p>Uses reflection to determine the concrete subclass, stores the name of the subclass and
-     * uses its codec to serialize the data.
-     *
-     * <p>This is no longer needed and only adds useless overhead.
-     */
-    // TODO(shahan): delete this and all references to it
-    POLYMORPHIC,
-    /**
      * For use with classes that are singleton.
      *
      * <p>The serialized class must have a codec accessible, static INSTANCE field.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
index c3d14df..935e973 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
@@ -21,7 +21,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.PolymorphicHelper;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationCodeGenerator.Marshaller;
 import com.squareup.javapoet.ClassName;
@@ -102,9 +101,6 @@
         case PUBLIC_FIELDS:
           codecClassBuilder = buildClassWithPublicFieldsStrategy(encodedType);
           break;
-        case POLYMORPHIC:
-          codecClassBuilder = buildClassWithPolymorphicStrategy(encodedType);
-          break;
         case SINGLETON:
           codecClassBuilder = buildClassWithSingletonStrategy(encodedType);
           break;
@@ -536,36 +532,6 @@
     return Optional.empty();
   }
 
-  private TypeSpec.Builder buildClassWithPolymorphicStrategy(TypeElement encodedType) {
-    if (!encodedType.getModifiers().contains(Modifier.ABSTRACT)) {
-      throw new IllegalArgumentException(
-          encodedType + " is not abstract, but POLYMORPHIC was selected as the strategy.");
-    }
-    TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType);
-    codecClassBuilder.addMethod(buildPolymorphicSerializeMethod(encodedType));
-    codecClassBuilder.addMethod(buildPolymorphicDeserializeMethod(encodedType));
-    return codecClassBuilder;
-  }
-
-  private MethodSpec buildPolymorphicSerializeMethod(TypeElement encodedType) {
-    MethodSpec.Builder builder = AutoCodecUtil.initializeSerializeMethodBuilder(encodedType);
-    TypeName polyClass = TypeName.get(env.getTypeUtils().erasure(encodedType.asType()));
-      builder.addStatement(
-          "$T.serialize(context, input, $T.class, codedOut, null)",
-          PolymorphicHelper.class,
-          polyClass);
-    return builder.build();
-  }
-
-  private static MethodSpec buildPolymorphicDeserializeMethod(TypeElement encodedType) {
-    MethodSpec.Builder builder = AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType);
-      builder.addStatement(
-          "return ($T) $T.deserialize(context, codedIn, null)",
-          TypeName.get(encodedType.asType()),
-          PolymorphicHelper.class);
-    return builder.build();
-  }
-
   private static TypeSpec.Builder buildClassWithSingletonStrategy(TypeElement encodedType) {
     TypeSpec.Builder codecClassBuilder = AutoCodecUtil.initializeCodecClassBuilder(encodedType);
     // Serialization is a no-op.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImport.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImport.java
index 469d7b5..471fba4 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImport.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkImport.java
@@ -14,8 +14,6 @@
 package com.google.devtools.build.lib.syntax;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.Serializable;
 import javax.annotation.Nullable;
@@ -24,10 +22,7 @@
  * Encapsulates the four syntactic variants of Skylark imports: Absolute paths, relative paths,
  * absolute labels, and relative labels.
  */
-@AutoCodec(strategy = AutoCodec.Strategy.POLYMORPHIC)
 public interface SkylarkImport extends Serializable {
-  ObjectCodec<SkylarkImport> CODEC = new SkylarkImport_AutoCodec();
-
   /**
    * Returns the string originally used to specify the import (may represent a label or a path).
    */
@@ -58,9 +53,8 @@
 
   /**
    * Returns a {@link PathFragment} representing the import path.
-   * 
+   *
    * @throws IllegalStateException if this import does not take the form of an absolute path.
    */
   PathFragment getAbsolutePath();
 }
-
diff --git a/src/test/java/com/google/devtools/build/lib/events/LocationTest.java b/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
index 2b32a63..17c95b0 100644
--- a/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/events/LocationTest.java
@@ -15,7 +15,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,11 +57,10 @@
 
   @Test
   public void testCodec() throws Exception {
-    ObjectCodecTester.newBuilder(Location.CODEC)
-        .addSubjects(
+    new SerializationTester(
             Location.fromPathFragment(path),
             Location.fromPathAndStartColumn(path, 0, 100, new Location.LineAndColumn(20, 25)),
             Location.BUILTIN)
-        .buildAndRunTests();
+        .runTests();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index e63d1ea..ce60452 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -65,7 +65,7 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
-import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -492,10 +492,9 @@
     }
   }
 
-  private static class SingletonActionLookupKey extends ActionLookupValue.ActionLookupKey {
-
-    public static final SingletonCodec<SingletonActionLookupKey> CODEC =
-        SingletonCodec.of(new SingletonActionLookupKey(), "none");
+  @AutoCodec(strategy = AutoCodec.Strategy.SINGLETON)
+  static class SingletonActionLookupKey extends ActionLookupValue.ActionLookupKey {
+    public static final SingletonActionLookupKey INSTANCE = new SingletonActionLookupKey();
 
     @Override
     public SkyFunctionName functionName() {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
index c07d44b..9d2df743 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/LexerTest.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.events.Reporter;
-import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -498,8 +498,6 @@
 
   @Test
   public void testLexerLocationCodec() throws Exception {
-    ObjectCodecTester.newBuilder(Location.CODEC)
-        .addSubjects(createLexer("foo").createLocation(0, 2))
-        .buildAndRunTests();
+    new SerializationTester(createLexer("foo").createLocation(0, 2)).runTests();
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
index e3269f6..3488047 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkImportsTest.java
@@ -17,7 +17,7 @@
 import static org.hamcrest.CoreMatchers.startsWith;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.syntax.SkylarkImports.SkylarkImportSyntaxException;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import org.junit.Rule;
@@ -232,12 +232,11 @@
 
   @Test
   public void serialization() throws Exception {
-    ObjectCodecTester.newBuilder(SkylarkImport.CODEC)
-        .addSubjects(
+    new SerializationTester(
             SkylarkImports.create("//some/skylark:file.bzl"),
             SkylarkImports.create("/some/skylark/file"),
             SkylarkImports.create(":subdirectory/containing/file.bzl"),
             SkylarkImports.create("file"))
-        .buildAndRunTests();
+        .runTests();
   }
 }