diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index ee5b3b6..bdb273e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -45,15 +45,11 @@
    * A dummy aspect factory. Is there to demonstrate how to define aspects and so that we can test
    * {@code attributeAspect}.
    */
-  public static final class TestAspectFactory implements ConfiguredNativeAspectFactory {
-    private final AspectDefinition definition;
+  public static final class TestAspectClass extends NativeAspectClass
+    implements ConfiguredAspectFactory {
+    private AspectDefinition definition;
 
-    /**
-     * Normal aspects will have an argumentless constructor and their definition will be hard-wired
-     * as a static member. This one is different so that we can create the definition in a test
-     * method.
-     */
-    private TestAspectFactory(AspectDefinition definition) {
+    public void setAspectDefinition(AspectDefinition definition) {
       this.definition = definition;
     }
 
@@ -69,6 +65,8 @@
     }
   }
 
+  public static final TestAspectClass TEST_ASPECT_CLASS = new TestAspectClass();
+
   @Test
   public void testAspectWithImplicitOrLateboundAttribute_AddsToAttributeMap() throws Exception {
     Attribute implicit = attr("$runtime", BuildType.LABEL)
@@ -120,13 +118,11 @@
   @Test
   public void testAttributeAspect_WrapsAndAddsToMap() throws Exception {
     AspectDefinition withAspects = new AspectDefinition.Builder("attribute_aspect")
-        .attributeAspect("srcs", TestAspectFactory.class)
-        .attributeAspect("deps", new NativeAspectClass<TestAspectFactory>(TestAspectFactory.class))
+        .attributeAspect("srcs", TEST_ASPECT_CLASS)
+        .attributeAspect("deps", TEST_ASPECT_CLASS)
         .build();
-    assertThat(withAspects.getAttributeAspects())
-        .containsEntry("srcs", new NativeAspectClass<TestAspectFactory>(TestAspectFactory.class));
-    assertThat(withAspects.getAttributeAspects())
-        .containsEntry("deps", new NativeAspectClass<TestAspectFactory>(TestAspectFactory.class));
+    assertThat(withAspects.getAttributeAspects()).containsEntry("srcs", TEST_ASPECT_CLASS);
+    assertThat(withAspects.getAttributeAspects()).containsEntry("deps", TEST_ASPECT_CLASS);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 253ac66..8a518bf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -38,6 +38,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
+import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
@@ -234,7 +235,7 @@
       public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
         return builder
             .add(attr("foo", LABEL_LIST).legacyAllowAnyFileType()
-                .aspect(AspectWithEmptyLateBoundAttribute.class))
+                .aspect(ASPECT_WITH_EMPTY_LATE_BOUND_ATTRIBUTE))
             .build();
       }
 
@@ -245,7 +246,8 @@
       }
     }
 
-    public static class AspectWithEmptyLateBoundAttribute implements ConfiguredNativeAspectFactory {
+    public static class AspectWithEmptyLateBoundAttribute extends NativeAspectClass
+      implements ConfiguredAspectFactory {
       @Override
       public AspectDefinition getDefinition(AspectParameters params) {
         return new AspectDefinition.Builder("testaspect")
@@ -266,6 +268,8 @@
             .build();
       }
     }
+    public static final AspectWithEmptyLateBoundAttribute ASPECT_WITH_EMPTY_LATE_BOUND_ATTRIBUTE =
+        new AspectWithEmptyLateBoundAttribute();
   }
 
   /**
@@ -293,8 +297,8 @@
       @Override
       public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
         return builder
-            .add(attr("foo", LABEL_LIST).legacyAllowAnyFileType().aspect(
-                AspectThatRegistersAction.class))
+            .add(attr("foo", LABEL_LIST).legacyAllowAnyFileType()
+                .aspect(ASPECT_THAT_REGISTERS_ACTION))
             .add(attr(":action_listener", LABEL_LIST).cfg(HOST).value(ACTION_LISTENER))
             .build();
       }
@@ -306,7 +310,8 @@
       }
     }
 
-    public static class AspectThatRegistersAction implements ConfiguredNativeAspectFactory {
+    public static class AspectThatRegistersAction extends NativeAspectClass
+      implements ConfiguredAspectFactory {
       @Override
       public AspectDefinition getDefinition(AspectParameters params) {
         return new AspectDefinition.Builder("testaspect").build();
@@ -320,6 +325,8 @@
         return new ConfiguredAspect.Builder("testaspect", ruleContext).build();
       }
     }
+    private static final AspectThatRegistersAction ASPECT_THAT_REGISTERS_ACTION =
+        new AspectThatRegistersAction();
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
index 882b483..bcdb951 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectValueTest.java
@@ -16,11 +16,11 @@
 import com.google.common.testing.EqualsTester;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
+import com.google.devtools.build.lib.analysis.util.TestAspects;
 import com.google.devtools.build.lib.analysis.util.TestAspects.AttributeAspect;
 import com.google.devtools.build.lib.analysis.util.TestAspects.ExtraAttributeAspect;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.AspectParameters;
-import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.skyframe.AspectValue;
 
 import org.junit.Test;
@@ -50,12 +50,9 @@
     AspectParameters i2 = new AspectParameters.Builder()
         .addAttribute("foo", "baz")
         .build();
-    NativeAspectClass<AttributeAspect> a1 =
-        new NativeAspectClass<AttributeAspect>(AttributeAspect.class);
-    NativeAspectClass<AttributeAspect> a1b =
-        new NativeAspectClass<AttributeAspect>(AttributeAspect.class);
-    NativeAspectClass<ExtraAttributeAspect> a2 =
-        new NativeAspectClass<ExtraAttributeAspect>(ExtraAttributeAspect.class);
+    AttributeAspect a1 = TestAspects.ATTRIBUTE_ASPECT;
+    AttributeAspect a1b = TestAspects.ATTRIBUTE_ASPECT;
+    ExtraAttributeAspect a2 = TestAspects.EXTRA_ATTRIBUTE_ASPECT;
 
     // label: //a:l1 or //a:l2
     // aspectConfiguration: target or host
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index 13d31cc..c534f69 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -101,14 +101,13 @@
     update();
   }
 
-  private <T extends ConfiguredNativeAspectFactory>
-    ListMultimap<Attribute, Dependency> dependentNodeMap(
-      String targetName, Class<T> aspect) throws Exception {
+  private ListMultimap<Attribute, Dependency> dependentNodeMap(
+      String targetName, NativeAspectClass aspect) throws Exception {
     Target target = packageManager.getTarget(reporter, Label.parseAbsolute(targetName));
     return dependencyResolver.dependentNodeMap(
         new TargetAndConfiguration(target, getTargetConfiguration()),
         getHostConfiguration(),
-        aspect != null ? Aspect.forNative(new NativeAspectClass<T>(aspect)) : null,
+        aspect != null ? Aspect.forNative(aspect) : null,
         ImmutableSet.<ConfigMatchingProvider>of());
   }
 
@@ -148,7 +147,7 @@
     ListMultimap<Attribute, Dependency> map = dependentNodeMap("//a:a", null);
     assertDep(
         map, "foo", "//a:b",
-        new AspectDescriptor(new NativeAspectClass<>(TestAspects.SimpleAspect.class)));
+        new AspectDescriptor(TestAspects.SIMPLE_ASPECT));
   }
 
   @Test
@@ -158,10 +157,10 @@
         "simple(name='a', foo=[':b'])",
         "simple(name='b', foo=[])");
     ListMultimap<Attribute, Dependency> map =
-        dependentNodeMap("//a:a", TestAspects.AttributeAspect.class);
+        dependentNodeMap("//a:a", TestAspects.ATTRIBUTE_ASPECT);
     assertDep(
         map, "foo", "//a:b",
-        new AspectDescriptor(new NativeAspectClass<>(TestAspects.AttributeAspect.class)));
+        new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT));
   }
 
   @Test
@@ -170,7 +169,7 @@
     pkg("a", "base(name='a')");
     pkg("extra", "base(name='extra')");
     ListMultimap<Attribute, Dependency> map =
-        dependentNodeMap("//a:a", TestAspects.ExtraAttributeAspect.class);
+        dependentNodeMap("//a:a", TestAspects.EXTRA_ATTRIBUTE_ASPECT);
     assertDep(map, "$dep", "//extra:extra");
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
index 0e4908d..e2b0fa7 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyTest.java
@@ -23,12 +23,8 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
 import com.google.devtools.build.lib.analysis.util.TestAspects;
-import com.google.devtools.build.lib.analysis.util.TestAspects.AttributeAspect;
-import com.google.devtools.build.lib.analysis.util.TestAspects.SimpleAspect;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
-import com.google.devtools.build.lib.packages.NativeAspectClass;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -84,10 +80,8 @@
   @Test
   public void withConfigurationAndAspects_BasicAccessors() throws Exception {
     update();
-    AspectDescriptor simpleAspect = new AspectDescriptor(
-        new NativeAspectClass<SimpleAspect>(SimpleAspect.class));
-    AspectDescriptor attributeAspect = new AspectDescriptor(
-        new NativeAspectClass<AttributeAspect>(AttributeAspect.class));
+    AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+    AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
     ImmutableSet<AspectDescriptor> twoAspects = ImmutableSet.of(simpleAspect, attributeAspect);
     Dependency targetDep =
         Dependency.withConfigurationAndAspects(
@@ -130,10 +124,8 @@
   public void withConfigurationAndAspects_RejectsNullConfigWithNPE() throws Exception {
     // Although the NullPointerTester should check this, this test invokes a different code path,
     // because it includes aspects (which the NPT test will not).
-    AspectDescriptor simpleAspect = new AspectDescriptor(
-        new NativeAspectClass<SimpleAspect>(SimpleAspect.class));
-    AspectDescriptor attributeAspect = new AspectDescriptor(
-        new NativeAspectClass<AttributeAspect>(AttributeAspect.class));
+    AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+    AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
     ImmutableSet<AspectDescriptor> twoAspects = ImmutableSet.of(simpleAspect, attributeAspect);
 
     try {
@@ -160,10 +152,8 @@
   @Test
   public void withConfiguredAspects_BasicAccessors() throws Exception {
     update();
-    AspectDescriptor simpleAspect = new AspectDescriptor(
-        new NativeAspectClass<TestAspects.SimpleAspect>(TestAspects.SimpleAspect.class));
-    AspectDescriptor attributeAspect = new AspectDescriptor(
-        new NativeAspectClass<AttributeAspect>(AttributeAspect.class));
+    AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+    AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
     ImmutableMap<AspectDescriptor, BuildConfiguration> twoAspectMap = ImmutableMap.of(
         simpleAspect, getTargetConfiguration(), attributeAspect, getHostConfiguration());
     Dependency targetDep =
@@ -200,10 +190,8 @@
 
   @Test
   public void withTransitionAndAspects_BasicAccessors() throws Exception {
-    AspectDescriptor simpleAspect = new AspectDescriptor(
-        new NativeAspectClass<>(SimpleAspect.class));
-    AspectDescriptor attributeAspect = new AspectDescriptor(
-        new NativeAspectClass<>(AttributeAspect.class));
+    AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+    AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
     ImmutableSet<AspectDescriptor> twoAspects = ImmutableSet.of(simpleAspect, attributeAspect);
     Dependency hostDep =
         Dependency.withTransitionAndAspects(
@@ -262,12 +250,9 @@
     BuildConfiguration host = getHostConfiguration();
     BuildConfiguration target = getTargetConfiguration();
 
-    AspectDescriptor simpleAspect = new AspectDescriptor(
-        new NativeAspectClass<>(TestAspects.SimpleAspect.class));
-    AspectDescriptor attributeAspect = new AspectDescriptor(
-        new NativeAspectClass<>(TestAspects.AttributeAspect.class));
-    AspectDescriptor errorAspect = new AspectDescriptor(
-        new NativeAspectClass<>(TestAspects.ErrorAspect.class));
+    AspectDescriptor simpleAspect = new AspectDescriptor(TestAspects.SIMPLE_ASPECT);
+    AspectDescriptor attributeAspect = new AspectDescriptor(TestAspects.ATTRIBUTE_ASPECT);
+    AspectDescriptor errorAspect = new AspectDescriptor(TestAspects.ERROR_ASPECT);
 
     ImmutableSet<AspectDescriptor> twoAspects = ImmutableSet.of(simpleAspect, attributeAspect);
     ImmutableSet<AspectDescriptor> inverseAspects = ImmutableSet.of(attributeAspect, simpleAspect);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 994ab41..3376a21 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -52,7 +52,6 @@
 import com.google.devtools.build.lib.analysis.BuildView;
 import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult;
 import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment;
-import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredAttributeMapper;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
@@ -548,7 +547,7 @@
     return getGeneratingSpawnAction(
         Iterables.find(getFilesToBuild(target), artifactNamed(outputName)));
   }
- 
+
   protected void simulateLoadingPhase() {
     try {
       ensureTargetsVisited(targetConfig.getAllLabels().values());
@@ -922,7 +921,7 @@
    * is creating an Artifact.
    */
   protected Artifact getBinArtifact(String packageRelativePath, ConfiguredTarget owner,
-      Class<? extends ConfiguredAspectFactory> creatingAspectFactory) {
+      NativeAspectClass creatingAspectFactory) {
     return getPackageRelativeDerivedArtifact(
         packageRelativePath,
         owner.getConfiguration().getBinDirectory(),
@@ -931,7 +930,7 @@
                     owner.getLabel(),
                     owner.getConfiguration(),
                     owner.getConfiguration(),
-                    new NativeAspectClass(creatingAspectFactory),
+                    creatingAspectFactory,
                     AspectParameters.EMPTY)
                 .argument());
   }
@@ -988,7 +987,7 @@
    * is creating an Artifact.
    */
   protected Artifact getGenfilesArtifact(String packageRelativePath, ConfiguredTarget owner,
-      Class<? extends ConfiguredAspectFactory> creatingAspectFactory) {
+      NativeAspectClass creatingAspectFactory) {
     return getGenfilesArtifact(
         packageRelativePath, owner, creatingAspectFactory, AspectParameters.EMPTY);
   }
@@ -996,7 +995,7 @@
   protected Artifact getGenfilesArtifact(
       String packageRelativePath,
       ConfiguredTarget owner,
-      Class<? extends ConfiguredAspectFactory> creatingAspectFactory,
+      NativeAspectClass creatingAspectFactory,
       AspectParameters params) {
     return getPackageRelativeDerivedArtifact(
         packageRelativePath,
@@ -1006,7 +1005,7 @@
                     owner.getLabel(),
                     owner.getConfiguration(),
                     owner.getConfiguration(),
-                    new NativeAspectClass(creatingAspectFactory),
+                    creatingAspectFactory,
                     params)
                 .argument());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 7d1a959..dc5a02a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -27,7 +27,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
-import com.google.devtools.build.lib.analysis.ConfiguredNativeAspectFactory;
+import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
@@ -48,6 +48,7 @@
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
 import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder;
@@ -148,7 +149,8 @@
   /**
    * A base class for mock aspects to reduce boilerplate.
    */
-  public abstract static class BaseAspect implements ConfiguredNativeAspectFactory {
+  public abstract static class BaseAspect extends NativeAspectClass
+    implements ConfiguredAspectFactory {
     @Override
     public ConfiguredAspect create(
         ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) {
@@ -164,7 +166,8 @@
     }
   }
 
-  private static final AspectDefinition SIMPLE_ASPECT =
+  public static final SimpleAspect SIMPLE_ASPECT = new SimpleAspect();
+  private static final AspectDefinition SIMPLE_ASPECT_DEFINITION =
       new AspectDefinition.Builder("simple").build();
 
   /**
@@ -173,16 +176,19 @@
   public static class SimpleAspect extends BaseAspect {
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return SIMPLE_ASPECT;
+      return SIMPLE_ASPECT_DEFINITION;
     }
   }
 
-  private static final AspectDefinition EXTRA_ATTRIBUTE_ASPECT =
+  public static final ExtraAttributeAspect EXTRA_ATTRIBUTE_ASPECT = new ExtraAttributeAspect();
+  private static final AspectDefinition EXTRA_ATTRIBUTE_ASPECT_DEFINITION =
       new AspectDefinition.Builder("extra_attribute")
           .add(attr("$dep", LABEL).value(Label.parseAbsoluteUnchecked("//extra:extra")))
           .build();
 
-  private static final AspectDefinition EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER =
+  private static final ExtraAttributeAspectRequiringProvider
+    EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER = new ExtraAttributeAspectRequiringProvider();
+  private static final AspectDefinition EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER_DEFINITION =
       new AspectDefinition.Builder("extra_attribute_with_provider")
           .add(attr("$dep", LABEL).value(Label.parseAbsoluteUnchecked("//extra:extra")))
           .requireProvider(RequiredProvider.class)
@@ -194,12 +200,14 @@
   public static class ExtraAttributeAspect extends BaseAspect {
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return EXTRA_ATTRIBUTE_ASPECT;
+      return EXTRA_ATTRIBUTE_ASPECT_DEFINITION;
     }
   }
 
-  private static final AspectDefinition ATTRIBUTE_ASPECT = new AspectDefinition.Builder("attribute")
-      .attributeAspect("foo", AttributeAspect.class)
+  public static final AttributeAspect ATTRIBUTE_ASPECT = new AttributeAspect();
+  private static final AspectDefinition ATTRIBUTE_ASPECT_DEFINITION =
+      new AspectDefinition.Builder("attribute")
+      .attributeAspect("foo", ATTRIBUTE_ASPECT)
       .build();
 
   /**
@@ -208,7 +216,7 @@
   public static class AttributeAspect extends BaseAspect {
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return ATTRIBUTE_ASPECT;
+      return ATTRIBUTE_ASPECT_DEFINITION;
     }
   }
 
@@ -218,27 +226,28 @@
   public static class ExtraAttributeAspectRequiringProvider extends BaseAspect {
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER;
+      return EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER_DEFINITION;
     }
   }
 
   public static class AspectRequiringProvider extends BaseAspect {
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return ASPECT_REQUIRING_PROVIDER;
+      return ASPECT_REQUIRING_PROVIDER_DEFINITION;
     }
   }
 
   /**
    * An aspect that has a definition depending on parameters provided by originating rule.
    */
-  public static class ParametrizedDefinitionAspect implements ConfiguredNativeAspectFactory {
+  public static class ParametrizedDefinitionAspect extends NativeAspectClass
+    implements ConfiguredAspectFactory {
 
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
       AspectDefinition.Builder builder =
           new AspectDefinition.Builder("parametrized_definition_aspect")
-              .attributeAspect("foo", ParametrizedDefinitionAspect.class);
+              .attributeAspect("foo", this);
       ImmutableCollection<String> baz = aspectParameters.getAttribute("baz");
       if (baz != null) {
         try {
@@ -274,8 +283,12 @@
     }
   }
 
+  private static final ParametrizedDefinitionAspect PARAMETRIZED_DEFINITION_ASPECT =
+      new ParametrizedDefinitionAspect();
 
-  private static final AspectDefinition ASPECT_REQUIRING_PROVIDER =
+  private static final AspectRequiringProvider ASPECT_REQUIRING_PROVIDER =
+      new AspectRequiringProvider();
+  private static final AspectDefinition ASPECT_REQUIRING_PROVIDER_DEFINITION =
       new AspectDefinition.Builder("requiring_provider")
           .requireProvider(RequiredProvider.class)
           .build();
@@ -283,7 +296,9 @@
   /**
    * An aspect that raises an error.
    */
-  public static class ErrorAspect implements ConfiguredNativeAspectFactory {
+  public static class ErrorAspect extends NativeAspectClass
+    implements ConfiguredAspectFactory {
+
     @Override
     public ConfiguredAspect create(
         ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) {
@@ -293,12 +308,14 @@
 
     @Override
     public AspectDefinition getDefinition(AspectParameters aspectParameters) {
-      return ERROR_ASPECT;
+      return ERROR_ASPECT_DEFINITION;
     }
   }
 
-  private static final AspectDefinition ERROR_ASPECT = new AspectDefinition.Builder("error")
-      .attributeAspect("bar", ErrorAspect.class)
+  public static final ErrorAspect ERROR_ASPECT = new ErrorAspect();
+  private static final AspectDefinition ERROR_ASPECT_DEFINITION =
+      new AspectDefinition.Builder("error")
+      .attributeAspect("bar", ERROR_ASPECT)
       .build();
 
   /**
@@ -341,9 +358,9 @@
     public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
       return builder
           .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
-              .aspect(SimpleAspect.class))
+              .aspect(SIMPLE_ASPECT))
           .add(attr("bar", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
-              .aspect(SimpleAspect.class))
+              .aspect(SIMPLE_ASPECT))
           .build();
 
     }
@@ -363,7 +380,7 @@
    */
   public static class AspectRequiringProviderRule implements RuleDefinition {
 
-    private static final class TestAspectParametersExtractor implements 
+    private static final class TestAspectParametersExtractor implements
         Function<Rule, AspectParameters> {
       @Override
       public AspectParameters apply(Rule rule) {
@@ -381,7 +398,7 @@
     public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
       return builder
           .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
-              .aspect(AspectRequiringProvider.class, new TestAspectParametersExtractor()))
+              .aspect(ASPECT_REQUIRING_PROVIDER, new TestAspectParametersExtractor()))
           .add(attr("baz", STRING))
           .build();
 
@@ -422,7 +439,7 @@
           .add(
               attr("foo", LABEL_LIST)
                   .allowedFileTypes(FileTypeSet.ANY_FILE)
-                  .aspect(ParametrizedDefinitionAspect.class, new TestAspectParametersExtractor()))
+                  .aspect(PARAMETRIZED_DEFINITION_ASPECT, new TestAspectParametersExtractor()))
           .add(attr("baz", STRING))
           .build();
     }
@@ -445,7 +462,7 @@
     public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
       return builder
           .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
-              .aspect(ExtraAttributeAspectRequiringProvider.class))
+              .aspect(EXTRA_ATTRIBUTE_ASPECT_REQUIRING_PROVIDER))
           .build();
 
     }
@@ -468,7 +485,7 @@
     public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
       return builder
           .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
-              .aspect(ErrorAspect.class))
+              .aspect(ERROR_ASPECT))
           .add(attr("bar", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE))
           .build();
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
index 07d5a28..c6d7ce2 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java
@@ -219,7 +219,7 @@
         attr("x", LABEL_LIST)
             .allowedFileTypes(txtFiles)
             .mandatory()
-            .aspect(TestAspects.SimpleAspect.class)
+            .aspect(TestAspects.SIMPLE_ASPECT)
             .build();
 
     {
@@ -238,7 +238,7 @@
               .cloneBuilder()
               .nonEmpty()
               .allowedRuleClasses(ruleClasses)
-              .aspect(TestAspects.ErrorAspect.class)
+              .aspect(TestAspects.ERROR_ASPECT)
               .build();
       assertEquals("x", childAttr2.getName());
       assertEquals(txtFiles, childAttr2.getAllowedFileTypesPredicate());
