diff --git a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
index 8f4e9ce..4a002c4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
@@ -32,7 +32,7 @@
 public abstract class AbstractAttributeMapper implements AttributeMap {
   private final RuleClass ruleClass;
   private final Label ruleLabel;
-  protected final Rule rule;
+  final Rule rule;
 
   protected AbstractAttributeMapper(Rule rule) {
     this.ruleClass = rule.getRuleClassObject();
@@ -66,7 +66,7 @@
     if (value instanceof Attribute.ComputedDefault) {
       value = ((Attribute.ComputedDefault) value).getDefault(this);
     } else if (value instanceof Attribute.LateBoundDefault) {
-      value = ((Attribute.LateBoundDefault) value).getDefault();
+      value = ((Attribute.LateBoundDefault<?, ?>) value).getDefault();
     } else if (value instanceof SelectorList) {
       throw new IllegalArgumentException(
           String.format(
@@ -194,7 +194,7 @@
   }
 
   /** Visits all labels reachable from the given attribute. */
-  protected void visitLabels(Attribute attribute, Type.LabelVisitor<Attribute> visitor) {
+  void visitLabels(Attribute attribute, Type.LabelVisitor<Attribute> visitor) {
     Type<?> type = attribute.getType();
     Object value = get(attribute.getName(), type);
     if (value != null) { // null values are particularly possible for computed defaults.
@@ -231,7 +231,7 @@
    * Helper routine that just checks the given attribute has the given type for this rule and throws
    * an IllegalException if not.
    */
-  protected void checkType(String attrName, Type<?> type) {
+  void checkType(String attrName, Type<?> type) {
     Integer index = ruleClass.getAttributeIndex(attrName);
     if (index == null) {
       throw new IllegalArgumentException(
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
index 6705a21..d627456 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
@@ -48,11 +48,9 @@
   }
 
   public static final AdvertisedProviderSet ANY =
-      new AdvertisedProviderSet(
-          true, ImmutableSet.<Class<?>>of(), ImmutableSet.<StarlarkProviderIdentifier>of());
+      new AdvertisedProviderSet(true, ImmutableSet.of(), ImmutableSet.of());
   public static final AdvertisedProviderSet EMPTY =
-      new AdvertisedProviderSet(
-          false, ImmutableSet.<Class<?>>of(), ImmutableSet.<StarlarkProviderIdentifier>of());
+      new AdvertisedProviderSet(false, ImmutableSet.of(), ImmutableSet.of());
 
   public static AdvertisedProviderSet create(
       ImmutableSet<Class<?>> builtinProviders,
@@ -79,7 +77,7 @@
     }
 
     AdvertisedProviderSet that = (AdvertisedProviderSet) obj;
-    return Objects.equals(this.canHaveAnyProvider, that.canHaveAnyProvider)
+    return this.canHaveAnyProvider == that.canHaveAnyProvider
         && Objects.equals(this.builtinProviders, that.builtinProviders)
         && Objects.equals(this.starlarkProviders, that.starlarkProviders);
   }
@@ -91,7 +89,7 @@
     }
     return String.format(
         "allowed built-in providers=%s, allowed Starlark providers=%s",
-        getBuiltinProviders(), getStarlarkProviders());
+        builtinProviders, starlarkProviders);
   }
 
   /** Checks whether the rule can have any provider.
@@ -124,9 +122,9 @@
    *       fingerprint (except for unintentional digest collisions).
    * </ul>
    *
-   * <p>In other words, {@link #fingerprint} is a proxy for {@link #equals}. These properties *do
-   * not* need to be maintained across Blaze versions (e.g. there's no need to worry about
-   * historical serialized fingerprints).
+   * <p>In other words, this method is a proxy for {@link #equals}. These properties *do not* need
+   * to be maintained across Blaze versions (e.g. there's no need to worry about historical
+   * serialized fingerprints).
    */
   public void fingerprint(Fingerprint fp) {
     fp.addBoolean(canHaveAnyProvider);
@@ -142,17 +140,6 @@
 
   /**
    * Returns {@code true} if this provider set can have any provider, or if it advertises the
-   * specific built-in provider requested.
-   */
-  public boolean advertises(Class<?> builtinProviderClass) {
-    if (canHaveAnyProvider()) {
-      return true;
-    }
-    return builtinProviders.contains(builtinProviderClass);
-  }
-
-  /**
-   * Returns {@code true} if this provider set can have any provider, or if it advertises the
    * specific Starlark provider requested.
    */
   public boolean advertises(StarlarkProviderIdentifier starlarkProvider) {
@@ -213,10 +200,5 @@
       starlarkProviders.add(id);
       return this;
     }
-
-    public Builder addStarlark(Provider.Key id) {
-      starlarkProviders.add(StarlarkProviderIdentifier.forKey(id));
-      return this;
-    }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
index 217d674..bdd9ec6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
@@ -153,7 +153,8 @@
   }
 
   /** {@link ObjectCodec} for {@link Aspect}. */
-  static class AspectCodec implements ObjectCodec<Aspect> {
+  @SuppressWarnings("unused") // Used reflectively.
+  private static final class AspectCodec implements ObjectCodec<Aspect> {
     @Override
     public Class<Aspect> getEncodedClass() {
       return Aspect.class;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
index 1298594..cbe417f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
@@ -133,10 +133,6 @@
     return aspectClass.getName();
   }
 
-  public AspectClass getAspectClass() {
-    return aspectClass;
-  }
-
   /**
    * Returns the attributes of the aspect in the form of a String -&gt; {@link Attribute} map.
    *
@@ -220,7 +216,7 @@
   }
 
   public static boolean satisfies(Aspect aspect, AdvertisedProviderSet advertisedProviderSet) {
-    return aspect.getDefinition().getRequiredProviders().isSatisfiedBy(advertisedProviderSet);
+    return aspect.getDefinition().requiredProviders.isSatisfiedBy(advertisedProviderSet);
   }
 
   /** Checks if the given {@code maybeRequiredAspect} is required by this aspect definition */
@@ -255,7 +251,7 @@
           }
           consumer.accept(aspectAttribute, repositoryRelativeLabel);
         };
-    for (Attribute aspectAttribute : aspect.getDefinition().getAttributes().values()) {
+    for (Attribute aspectAttribute : aspect.getDefinition().attributes.values()) {
       if (!dependencyFilter.apply(aspect, aspectAttribute)) {
         continue;
       }
@@ -277,10 +273,11 @@
     private final Map<String, Attribute> attributes = new LinkedHashMap<>();
     private final AdvertisedProviderSet.Builder advertisedProviders =
         AdvertisedProviderSet.builder();
-    private RequiredProviders.Builder requiredProviders = RequiredProviders.acceptAnyBuilder();
+    private final RequiredProviders.Builder requiredProviders =
+        RequiredProviders.acceptAnyBuilder();
     private BiPredicate<Object, String> propagateViaAttribute =
         (BiPredicate<Object, String> & Serializable) (a, c) -> true;
-    private RequiredProviders.Builder requiredAspectProviders =
+    private final RequiredProviders.Builder requiredAspectProviders =
         RequiredProviders.acceptNoneBuilder();
     @Nullable private LinkedHashSet<String> propagateAlongAttributes = new LinkedHashSet<>();
     private final ConfigurationFragmentPolicy.Builder configurationFragmentPolicy =
@@ -350,17 +347,18 @@
 
     /**
      * Optional predicate to conditionally propagate down an attribute based on the {@link
-     * BuildConfiguration}.
+     * com.google.devtools.build.lib.analysis.config.BuildConfiguration}.
      *
      * <p>This is implemented specifically to support the platform-based Android toolchain
-     * migration. See {@link DexArchiveAspect} for details. Don't use this for other purposes. It
-     * introduces unfortunate API complexity and should be removed when Android no longer needs it.
+     * migration. See {@link com.google.devtools.build.lib.rules.android.DexArchiveAspect} for
+     * details. Don't use this for other purposes. It introduces unfortunate API complexity and
+     * should be removed when Android no longer needs it.
      *
-     * @param propagateFunction {@link BiPredicate} that takes the aspect's {@link
-     *     BuildConfiguration} and name of the attribute to propagate. If it returns true,
-     *     propagates down this attribute in this configuration. We don't explicitly type with
-     *     {@link BuildConfiguration} because {@link AspectDefinition} is a loading phase class,
-     *     with no access to config symbols.
+     * @param propagateFunction {@link BiPredicate} that takes the aspect's build configuration and
+     *     name of the attribute to propagate. If it returns true, propagates down this attribute in
+     *     this configuration. We don't explicitly type with {@link
+     *     com.google.devtools.build.lib.analysis.config.BuildConfiguration} because {@link
+     *     AspectDefinition} is a loading phase class, with no access to config symbols.
      */
     public Builder propagateViaAttribute(BiPredicate<Object, String> propagateFunction) {
       propagateViaAttribute = propagateFunction;
@@ -403,13 +401,12 @@
      * Declares that this aspect propagates along an {@code attribute} on the target associated with
      * this aspect.
      *
-     * <p>Specify multiple attributes by calling {@link #propagateAlongAttribute(String)}
-     * repeatedly.
+     * <p>Specify multiple attributes by calling this method repeatedly.
      *
      * <p>Aspect can also declare to propagate along all attributes with {@link
      * #propagateAlongAttributes}.
      */
-    public final Builder propagateAlongAttribute(String attribute) {
+    public Builder propagateAlongAttribute(String attribute) {
       Preconditions.checkNotNull(attribute);
       Preconditions.checkState(
           this.propagateAlongAttributes != null,
@@ -426,7 +423,7 @@
      *
      * <p>Specify either this or {@link #propagateAlongAttribute(String)}, not both.
      */
-    public final Builder propagateAlongAllAttributes() {
+    public Builder propagateAlongAllAttributes() {
       Preconditions.checkState(
           this.propagateAlongAttributes != null,
           "Aspects for all attributes must only be specified once");
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index a3bd3fb..d4b7adb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -80,15 +80,14 @@
   abstract static class RuleAspect<C extends AspectClass> {
     private static final ImmutableList<String> ALL_ATTR_ASPECTS = ImmutableList.of("*");
 
-    protected final C aspectClass;
-    protected final Function<Rule, AspectParameters> parametersExtractor;
+    final C aspectClass;
+    final Function<Rule, AspectParameters> parametersExtractor;
 
-    protected String baseAspectName;
-    protected ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>>
-        inheritedRequiredProviders;
-    protected ImmutableList.Builder<String> inheritedAttributeAspects;
-    protected boolean inheritedAllProviders = false;
-    protected boolean inheritedAllAttributes = false;
+    String baseAspectName;
+    ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>> inheritedRequiredProviders;
+    ImmutableList.Builder<String> inheritedAttributeAspects;
+    boolean inheritedAllProviders = false;
+    boolean inheritedAllAttributes = false;
 
     private RuleAspect(C aspectClass, Function<Rule, AspectParameters> parametersExtractor) {
       this.aspectClass = aspectClass;
@@ -124,21 +123,21 @@
       }
     }
 
-    public String getName() {
+    String getName() {
       return this.aspectClass.getName();
     }
 
-    public ImmutableSet<String> getRequiredParameters() {
-      return ImmutableSet.<String>of();
+    ImmutableSet<String> getRequiredParameters() {
+      return ImmutableSet.of();
     }
 
-    public abstract Aspect getAspect(Rule rule);
+    protected abstract Aspect getAspect(Rule rule);
 
-    public C getAspectClass() {
+    C getAspectClass() {
       return aspectClass;
     }
 
-    protected void updateInheritedRequiredProviders(
+    void updateInheritedRequiredProviders(
         ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredProviders) {
       if (!inheritedAllProviders && !requiredProviders.isEmpty()) {
         if (inheritedRequiredProviders == null) {
@@ -151,7 +150,7 @@
       }
     }
 
-    protected void updateInheritedAttributeAspects(ImmutableList<String> attributeAspects) {
+    void updateInheritedAttributeAspects(ImmutableList<String> attributeAspects) {
       if (!inheritedAllAttributes && !ALL_ATTR_ASPECTS.equals(attributeAspects)) {
         if (inheritedAttributeAspects == null) {
           inheritedAttributeAspects = ImmutableList.builder();
@@ -163,7 +162,7 @@
       }
     }
 
-    protected RequiredProviders buildInheritedRequiredProviders() {
+    RequiredProviders buildInheritedRequiredProviders() {
       if (baseAspectName == null) {
         return RequiredProviders.acceptNoneBuilder().build();
       } else if (inheritedAllProviders) {
@@ -184,13 +183,13 @@
     }
 
     @Nullable
-    protected ImmutableSet<String> buildInheritedAttributeAspects() {
+    ImmutableSet<String> buildInheritedAttributeAspects() {
       if (baseAspectName == null) {
         return ImmutableSet.of();
       } else if (inheritedAllAttributes) {
         return null;
       } else {
-        return ImmutableSet.<String>copyOf(inheritedAttributeAspects.build());
+        return ImmutableSet.copyOf(inheritedAttributeAspects.build());
       }
     }
 
@@ -204,11 +203,6 @@
     public ImmutableList<String> getInheritedAttributeAspectsList() {
       return inheritedAttributeAspects == null ? null : inheritedAttributeAspects.build();
     }
-
-    @VisibleForSerialization
-    public String getBaseAspectName() {
-      return baseAspectName;
-    }
   }
 
   private static class NativeRuleAspect extends RuleAspect<NativeAspectClass> {
@@ -626,7 +620,7 @@
      *     set.
      */
     public Builder<TYPE> setPropertyFlag(String propertyName) throws EvalException {
-      PropertyFlag flag = null;
+      PropertyFlag flag;
       try {
         flag = PropertyFlag.valueOf(propertyName);
       } catch (IllegalArgumentException e) {
@@ -1049,7 +1043,7 @@
      * <p>This only works on a per-target basis, not on a per-file basis; with other words, it works
      * for 'deps' attributes, but not 'srcs' attributes.
      */
-    public Builder<TYPE> allowedRuleClassesWithWarning(RuleClassNamePredicate allowedRuleClasses) {
+    Builder<TYPE> allowedRuleClassesWithWarning(RuleClassNamePredicate allowedRuleClasses) {
       Preconditions.checkState(
           type.getLabelClass() == LabelClass.DEPENDENCY, "must be a label-valued type");
       propertyFlags.add(PropertyFlag.STRICT_LABEL_CHECKING);
@@ -1081,7 +1075,7 @@
      * this label type attribute has to provide all the providers from one of those lists, otherwise
      * an error is produced during the analysis phase.
      */
-    public final Builder<TYPE> mandatoryBuiltinProvidersList(
+    final Builder<TYPE> mandatoryBuiltinProvidersList(
         Iterable<? extends Iterable<Class<? extends TransitiveInfoProvider>>> providersList) {
       Preconditions.checkState(
           type.getLabelClass() == LabelClass.DEPENDENCY, "must be a label-valued type");
@@ -1115,16 +1109,6 @@
       return this;
     }
 
-    public Builder<TYPE> legacyMandatoryProviders(String... ids) {
-      return mandatoryProviders(
-          Iterables.transform(
-              Arrays.asList(ids),
-              s -> {
-                Preconditions.checkNotNull(s);
-                return StarlarkProviderIdentifier.forLegacy(s);
-              }));
-    }
-
     public Builder<TYPE> mandatoryProviders(Iterable<StarlarkProviderIdentifier> providers) {
       if (providers.iterator().hasNext()) {
         mandatoryProvidersList(ImmutableList.of(providers));
@@ -1362,11 +1346,7 @@
    * natively-defined {@link ComputedDefault}s, which are limited in the number of configurable
    * attributes they depend on, not on the number of different combinations of possible inputs.
    */
-  private static final ComputationLimiter<RuntimeException> NULL_COMPUTATION_LIMITER =
-      new ComputationLimiter<RuntimeException>() {
-        @Override
-        public void onComputationCount(int count) throws RuntimeException {}
-      };
+  private static final ComputationLimiter<RuntimeException> NULL_COMPUTATION_LIMITER = count -> {};
 
   /** Exception for computed default attributes that depend on too many configurable attributes. */
   private static class TooManyConfigurableAttributesException extends Exception {
@@ -1505,15 +1485,15 @@
      * Create a computed default that can read all non-configurable attribute values and no
      * configurable attribute values.
      */
-    public ComputedDefault() {
-      this(ImmutableList.<String>of());
+    protected ComputedDefault() {
+      this(ImmutableList.of());
     }
 
     /**
      * Create a computed default that can read all non-configurable attributes values and one
      * explicitly specified configurable attribute value
      */
-    public ComputedDefault(String depAttribute) {
+    protected ComputedDefault(String depAttribute) {
       this(ImmutableList.of(depAttribute));
     }
 
@@ -1521,7 +1501,7 @@
      * Create a computed default that can read all non-configurable attributes values and two
      * explicitly specified configurable attribute values.
      */
-    public ComputedDefault(String depAttribute1, String depAttribute2) {
+    protected ComputedDefault(String depAttribute1, String depAttribute2) {
       this(ImmutableList.of(depAttribute1, depAttribute2));
     }
 
@@ -1534,7 +1514,7 @@
      * growth of possible values. {@link StarlarkComputedDefault} uses this, but is limited by
      * {@link FixedComputationLimiter#COMPUTED_DEFAULT_MAX_COMBINATIONS}.
      */
-    protected ComputedDefault(ImmutableList<String> dependencies) {
+    ComputedDefault(ImmutableList<String> dependencies) {
       // Order is important for #createDependencyAssignmentTuple.
       this.dependencies = Ordering.natural().immutableSortedCopy(dependencies);
     }
@@ -1637,7 +1617,7 @@
           };
 
       ImmutableList.Builder<Type<?>> dependencyTypesBuilder = ImmutableList.builder();
-      Map<List<Object>, Object> lookupTable = new HashMap<>();
+      Map<List<Object>, Object> lookupTable;
       try {
         for (String dependency : dependencies) {
           Attribute attribute = rule.getRuleClassObject().getAttributeByNameMaybe(dependency);
@@ -1647,9 +1627,10 @@
           }
           dependencyTypesBuilder.add(attribute.getType());
         }
-        lookupTable.putAll(
-            strategy.computeValuesForAllCombinations(
-                dependencies, attr.getType(), rule, FixedComputationLimiter.INSTANCE));
+        lookupTable =
+            new HashMap<>(
+                strategy.computeValuesForAllCombinations(
+                    dependencies, attr.getType(), rule, FixedComputationLimiter.INSTANCE));
         if (caughtEvalExceptionIfAny.get() != null) {
           throw caughtEvalExceptionIfAny.get();
         }
@@ -2003,10 +1984,9 @@
   public static class LabelListLateBoundDefault<FragmentT>
       extends SimpleLateBoundDefault<FragmentT, List<Label>> {
     private LabelListLateBoundDefault(
-        boolean useHostConfiguration,
         Class<FragmentT> fragmentClass,
         Resolver<FragmentT, List<Label>> resolver) {
-      super(useHostConfiguration, fragmentClass, ImmutableList.of(), resolver);
+      super(/*useHostConfiguration=*/ false, fragmentClass, ImmutableList.of(), resolver);
     }
 
     public static <FragmentT> LabelListLateBoundDefault<FragmentT> fromTargetConfiguration(
@@ -2015,7 +1995,7 @@
           !fragmentClass.equals(Void.class),
           "Use fromRuleAndAttributesOnly to specify a LateBoundDefault which does not use "
               + "configuration.");
-      return new LabelListLateBoundDefault<>(false, fragmentClass, resolver);
+      return new LabelListLateBoundDefault<>(fragmentClass, resolver);
     }
 
     /**
@@ -2032,7 +2012,7 @@
      */
     public static LabelListLateBoundDefault<Void> fromRuleAndAttributesOnly(
         Resolver<Void, List<Label>> resolver) {
-      return new LabelListLateBoundDefault<>(false, Void.class, resolver);
+      return new LabelListLateBoundDefault<>(Void.class, resolver);
     }
   }
 
@@ -2104,7 +2084,7 @@
    * @param transitionFactory the configuration transition for this attribute (which must be of type
    *     LABEL, LABEL_LIST, NODEP_LABEL or NODEP_LABEL_LIST).
    */
-  Attribute(
+  private Attribute(
       String name,
       String doc,
       Type<?> type,
@@ -2183,7 +2163,7 @@
    * of '$' or ':').
    */
   public String getPublicName() {
-    return getStarlarkName(getName());
+    return getStarlarkName(name);
   }
 
   /**
@@ -2309,8 +2289,8 @@
   /** Returns true if this attribute's value can be influenced by the build configuration. */
   public boolean isConfigurable() {
     // Output types are excluded because of Rule#populateExplicitOutputFiles.
-    return !(type.getLabelClass() == LabelClass.OUTPUT
-        || getPropertyFlag(PropertyFlag.NONCONFIGURABLE));
+    return type.getLabelClass() != LabelClass.OUTPUT
+        && !getPropertyFlag(PropertyFlag.NONCONFIGURABLE);
   }
 
   /**
@@ -2321,13 +2301,13 @@
    * <p>Non-dependency attributes will always return {@code false}.
    */
   public boolean isToolDependency() {
-    if (getType().getLabelClass() != LabelClass.DEPENDENCY) {
+    if (type.getLabelClass() != LabelClass.DEPENDENCY) {
       return false;
     }
     if (getPropertyFlag(PropertyFlag.IS_TOOL_DEPENDENCY)) {
       return true;
     }
-    return getTransitionFactory().isTool();
+    return transitionFactory.isTool();
   }
   /**
    * Returns a predicate that evaluates to true for rule classes that are allowed labels in this
@@ -2364,7 +2344,7 @@
   }
 
   public Predicate<AttributeMap> getCondition() {
-    return condition == null ? Predicates.<AttributeMap>alwaysTrue() : condition;
+    return condition == null ? Predicates.alwaysTrue() : condition;
   }
 
   public PredicateWithMessage<Object> getAllowedValues() {
@@ -2454,7 +2434,7 @@
    * designates implicit attributes.
    */
   public boolean isImplicit() {
-    return isImplicit(getName());
+    return isImplicit(name);
   }
 
   /**
@@ -2470,7 +2450,7 @@
    * late-bound attributes.
    */
   public boolean isLateBound() {
-    return isLateBound(getName());
+    return isLateBound(name);
   }
 
   /**
@@ -2592,12 +2572,12 @@
   public static Object valueToStarlark(Object x) {
     // Is x a non-empty string_list_dict?
     if (x instanceof Map) {
-      Map<?, ?> map = (Map) x;
+      Map<?, ?> map = (Map<?, ?>) x;
       if (!map.isEmpty() && map.values().iterator().next() instanceof List) {
         // Recursively convert subelements.
         Dict.Builder<Object, Object> dict = Dict.builder();
         for (Map.Entry<?, ?> e : map.entrySet()) {
-          dict.put((String) e.getKey(), Starlark.fromJava(e.getValue(), null));
+          dict.put(e.getKey(), Starlark.fromJava(e.getValue(), null));
         }
         return dict.buildImmutable();
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
index 28df7b5..4ce98be 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeFormatter.java
@@ -57,7 +57,7 @@
 public class AttributeFormatter {
 
   private static final ImmutableSet<Type<?>> depTypes =
-      ImmutableSet.<Type<?>>of(
+      ImmutableSet.of(
           STRING,
           LABEL,
           OUTPUT,
@@ -69,7 +69,7 @@
           DISTRIBUTIONS);
 
   private static final ImmutableSet<Type<?>> noDepTypes =
-      ImmutableSet.<Type<?>>of(NODEP_LABEL_LIST, NODEP_LABEL);
+      ImmutableSet.of(NODEP_LABEL_LIST, NODEP_LABEL);
 
   private AttributeFormatter() {}
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
index e958be7..7b8412b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
@@ -74,8 +74,7 @@
    */
   default <T> T getOrDefault(String attributeName, Type<T> type, T defaultValue) {
     if (has(attributeName)) {
-      T value = get(attributeName, type);
-      return value;
+      return get(attributeName, type);
     }
     return defaultValue;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
index e066387..28a6619 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
@@ -103,11 +103,6 @@
     this.analysisRuleLabel = analysisRuleLabel;
   }
 
-  /** Returns the phase to which this Starlark thread belongs. */
-  public Phase getPhase() {
-    return phase;
-  }
-
   /** Returns the name of the tools repository, such as "@bazel_tools". */
   @Nullable
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironment.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironment.java
index 46039c6..b7213e7 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkEnvironment.java
@@ -157,8 +157,7 @@
 
   private static ImmutableMap<String, Object> createUninjectedBuildBzlEnv(
       RuleClassProvider ruleClassProvider, Map<String, Object> uninjectedBuildBzlNativeBindings) {
-    Map<String, Object> env = new HashMap<>();
-    env.putAll(ruleClassProvider.getEnvironment());
+    Map<String, Object> env = new HashMap<>(ruleClassProvider.getEnvironment());
 
     // Determine the "native" module.
     // TODO(#11954): Use the same "native" object for both BUILD- and WORKSPACE-loaded .bzls, and
@@ -186,8 +185,7 @@
 
   private static ImmutableMap<String, Object> createWorkspaceBzlEnv(
       RuleClassProvider ruleClassProvider, Map<String, Object> workspaceBzlNativeBindings) {
-    Map<String, Object> env = new HashMap<>();
-    env.putAll(ruleClassProvider.getEnvironment());
+    Map<String, Object> env = new HashMap<>(ruleClassProvider.getEnvironment());
 
     // See above comments for native in BUILD bzls.
     env.put("native", createNativeModule(workspaceBzlNativeBindings));
@@ -199,8 +197,7 @@
       RuleClassProvider ruleClassProvider,
       ImmutableMap<String, Object> uninjectedBuildBzlNativeBindings,
       ImmutableMap<String, Object> uninjectedBuildBzlEnv) {
-    Map<String, Object> env = new HashMap<>();
-    env.putAll(ruleClassProvider.getEnvironment());
+    Map<String, Object> env = new HashMap<>(ruleClassProvider.getEnvironment());
 
     // Clear out rule-specific symbols like CcInfo.
     env.keySet().removeAll(ruleClassProvider.getNativeRuleSpecificBindings().keySet());
@@ -339,8 +336,7 @@
     Map<String, Boolean> overridesMap = parseInjectionOverridesList(overridesList);
 
     // Determine top-level symbols.
-    Map<String, Object> env = new HashMap<>();
-    env.putAll(uninjectedBuildBzlEnv);
+    Map<String, Object> env = new HashMap<>(uninjectedBuildBzlEnv);
     for (Map.Entry<String, Object> entry : exportedToplevels.entrySet()) {
       String key = entry.getKey();
       String name = getKeySuffix(key);
@@ -356,8 +352,7 @@
 
     // Determine "native" bindings.
     // TODO(#11954): See above comment in createUninjectedBuildBzlEnv.
-    Map<String, Object> nativeBindings = new HashMap<>();
-    nativeBindings.putAll(uninjectedBuildBzlNativeBindings);
+    Map<String, Object> nativeBindings = new HashMap<>(uninjectedBuildBzlNativeBindings);
     for (Map.Entry<String, Object> entry : exportedRules.entrySet()) {
       String key = entry.getKey();
       String name = getKeySuffix(key);
@@ -407,7 +402,7 @@
 
   /** Indicates a problem performing builtins injection. */
   public static final class InjectionException extends Exception {
-    public InjectionException(String message) {
+    InjectionException(String message) {
       super(message);
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildFileName.java b/src/main/java/com/google/devtools/build/lib/packages/BuildFileName.java
index 627ff36..b2ff9f2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuildFileName.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuildFileName.java
@@ -43,11 +43,9 @@
     }
   };
 
-  private static final BuildFileName[] VALUES = BuildFileName.values();
-
   private final PathFragment filenameFragment;
 
-  private BuildFileName(String filename) {
+  BuildFileName(String filename) {
     this.filenameFragment = PathFragment.create(filename);
   }
 
@@ -61,8 +59,4 @@
    * @param packageIdentifier the identifier for this package
    */
   public abstract PathFragment getBuildFileFragment(PackageIdentifier packageIdentifier);
-
-  public static BuildFileName lookupByOrdinal(int ordinal) {
-    return VALUES[ordinal];
-  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
index 940f06c..5feb884 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuildType.java
@@ -82,7 +82,7 @@
   @AutoCodec public static final Type<License> LICENSE = new LicenseType();
   /** The type of a single distribution. Only used internally, as a type symbol, not a converter. */
   @AutoCodec
-  public static final Type<DistributionType> DISTRIBUTION =
+  static final Type<DistributionType> DISTRIBUTION =
       new Type<DistributionType>() {
         @Override
         public DistributionType cast(Object value) {
@@ -147,7 +147,7 @@
       Type<T> type, Object x, Object what, LabelConversionContext context)
       throws ConversionException {
     if (x instanceof com.google.devtools.build.lib.packages.SelectorList) {
-      return new SelectorList<T>(
+      return new SelectorList<>(
           ((com.google.devtools.build.lib.packages.SelectorList) x).getElements(),
           what,
           context,
@@ -211,7 +211,7 @@
       this.convertedLabelsInPackage = convertedLabelsInPackage;
     }
 
-    public Label getLabel() {
+    Label getLabel() {
       return label;
     }
 
@@ -221,16 +221,15 @@
       // construction, and global Interner lookup. This approach tends to be very profitable
       // overall, since it's common for the targets in a single package to have duplicate
       // label-strings across all their attribute values.
-      Label label = convertedLabelsInPackage.get(input);
-      if (label == null) {
-        label = getLabel().getRelativeWithRemapping(input, getRepositoryMapping());
-        convertedLabelsInPackage.put(input, label);
+      Label converted = convertedLabelsInPackage.get(input);
+      if (converted == null) {
+        converted = label.getRelativeWithRemapping(input, repositoryMapping);
+        convertedLabelsInPackage.put(input, converted);
       }
-
-      return label;
+      return converted;
     }
 
-    public ImmutableMap<RepositoryName, RepositoryName> getRepositoryMapping() {
+    ImmutableMap<RepositoryName, RepositoryName> getRepositoryMapping() {
       return repositoryMapping;
     }
 
@@ -319,7 +318,7 @@
       super(LABEL, valueType, LabelClass.DEPENDENCY);
     }
 
-    public static <ValueT> LabelKeyedDictType<ValueT> create(Type<ValueT> valueType) {
+    static <ValueT> LabelKeyedDictType<ValueT> create(Type<ValueT> valueType) {
       Preconditions.checkArgument(
           valueType.getLabelClass() == LabelClass.NONE
               || valueType.getLabelClass() == LabelClass.DEPENDENCY,
@@ -343,8 +342,7 @@
       Map<Label, List<Object>> convertedFrom = new LinkedHashMap<>();
       for (Object original : input.keySet()) {
         Label label = LABEL.convert(original, what, context);
-        convertedFrom.computeIfAbsent(label, k -> new ArrayList<Object>());
-        convertedFrom.get(label).add(original);
+        convertedFrom.computeIfAbsent(label, k -> new ArrayList<>()).add(original);
       }
       Printer errorMessage = new Printer();
       errorMessage.append("duplicate labels");
@@ -373,9 +371,8 @@
   }
 
   /**
-   * Like Label, LicenseType is a derived type, which is declared specially
-   * in order to allow syntax validation. It represents the licenses, as
-   * described in {@ref License}.
+   * Like Label, LicenseType is a derived type, which is declared specially in order to allow syntax
+   * validation. It represents the licenses, as described in {@link License}.
    */
   public static class LicenseType extends Type<License> {
     @Override
@@ -409,12 +406,11 @@
   }
 
   /**
-   * Like Label, Distributions is a derived type, which is declared specially
-   * in order to allow syntax validation. It represents the declared distributions
-   * of a target, as described in {@ref License}.
+   * Like Label, Distributions is a derived type, which is declared specially in order to allow
+   * syntax validation. It represents the declared distributions of a target, as described in {@link
+   * License}.
    */
-  private static class Distributions extends
-      Type<Set<DistributionType>> {
+  private static class Distributions extends Type<Set<DistributionType>> {
     @SuppressWarnings("unchecked")
     @Override
     public Set<DistributionType> cast(Object value) {
@@ -491,7 +487,7 @@
       try {
         // Enforce value is relative to the context.
         Label currentRule;
-        ImmutableMap<RepositoryName, RepositoryName> repositoryMapping = ImmutableMap.of();
+        ImmutableMap<RepositoryName, RepositoryName> repositoryMapping;
         if (context instanceof LabelConversionContext) {
           currentRule = ((LabelConversionContext) context).getLabel();
           repositoryMapping = ((LabelConversionContext) context).getRepositoryMapping();
@@ -525,7 +521,7 @@
     SelectorList(
         List<Object> x, Object what, @Nullable LabelConversionContext context, Type<T> originalType)
         throws ConversionException {
-      if (x.size() > 1 && originalType.concat(ImmutableList.<T>of()) == null) {
+      if (x.size() > 1 && originalType.concat(ImmutableList.of()) == null) {
         throw new ConversionException(
             String.format("type '%s' doesn't support select concatenation", originalType));
       }
@@ -570,7 +566,7 @@
      */
     public Set<Label> getKeyLabels() {
       ImmutableSet.Builder<Label> keys = ImmutableSet.builder();
-      for (Selector<T> selector : getSelectors()) {
+      for (Selector<T> selector : elements) {
         for (Label label : selector.getEntries().keySet()) {
           if (!Selector.isReservedLabel(label)) {
             keys.add(label);
@@ -627,7 +623,7 @@
     @VisibleForTesting
     public static final String DEFAULT_CONDITION_KEY = "//conditions:default";
 
-    public static final Label DEFAULT_CONDITION_LABEL =
+    static final Label DEFAULT_CONDITION_LABEL =
         Label.parseAbsoluteUnchecked(DEFAULT_CONDITION_KEY);
 
     private final Type<T> originalType;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
index 33f430c..f04475a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
@@ -42,7 +42,7 @@
   private final String name;
   private final Class<T> valueClass;
 
-  public BuiltinProvider(String name, Class<T> valueClass) {
+  protected BuiltinProvider(String name, Class<T> valueClass) {
     this.key = new Key(name, getClass());
     this.name = name;
     this.valueClass = valueClass;
@@ -89,12 +89,12 @@
   @Override
   public void repr(Printer printer) {
     // TODO(adonovan): change to '<provider name>'.
-    printer.append("<function " + getPrintableName() + ">");
+    printer.append("<function " + name + ">");
   }
 
   /** Returns the identifier of this provider. */
   public StarlarkProviderIdentifier id() {
-    return StarlarkProviderIdentifier.forKey(getKey());
+    return StarlarkProviderIdentifier.forKey(key);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
index 50378c4..f9b80fd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConstantRuleVisibility.java
@@ -50,7 +50,7 @@
 
   private final boolean result;
 
-  public ConstantRuleVisibility(boolean result) {
+  private ConstantRuleVisibility(boolean result) {
     this.result = result;
   }
 
@@ -91,7 +91,7 @@
     return null;
   }
 
-  public static ConstantRuleVisibility tryParse(Label label) {
+  private static ConstantRuleVisibility tryParse(Label label) {
     if (PUBLIC_LABEL.equals(label)) {
       return PUBLIC;
     } else if (PRIVATE_LABEL.equals(label)) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java b/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java
index 754847f..f12cfb6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/DependencyFilter.java
@@ -72,14 +72,6 @@
               || attribute.getName().equals("visibility");
         }
       };
-  /** Checks to see if the attribute has the isDirectCompileTimeInput property. */
-  public static final DependencyFilter DIRECT_COMPILE_TIME_INPUT =
-      new DependencyFilter() {
-        @Override
-        public boolean apply(AttributeInfoProvider infoProvider, Attribute attribute) {
-          return attribute.isDirectCompileTimeInput();
-        }
-      };
 
   /**
    * Returns true if a given attribute should be processed.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java b/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
index 8ce7ecf..e3f2c2f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/EnumFilterConverter.java
@@ -16,7 +16,6 @@
 import com.google.devtools.build.lib.util.StringUtil;
 import com.google.devtools.common.options.Converter;
 import com.google.devtools.common.options.OptionsParsingException;
-
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.LinkedHashSet;
@@ -44,7 +43,7 @@
    * @param typeClass this should be E.class (Java generics can't infer that directly)
    * @param userFriendlyName a user-friendly description of this enum type
    */
-  public EnumFilterConverter(Class<E> typeClass, String userFriendlyName) {
+  EnumFilterConverter(Class<E> typeClass, String userFriendlyName) {
     this.typeClass = typeClass;
     this.prettyEnumName = userFriendlyName;
     for (E value : EnumSet.allOf(typeClass)) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/EnvironmentLabels.java b/src/main/java/com/google/devtools/build/lib/packages/EnvironmentLabels.java
index 4bbef07..e301f49 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/EnvironmentLabels.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/EnvironmentLabels.java
@@ -47,7 +47,7 @@
    * can't set this map until all Target instances for member environments have been initialized,
    * which occurs after group instantiation (this makes the class mutable).
    */
-  private Map<Label, NestedSet<Label>> fulfillersMap = null;
+  private Map<Label, NestedSet<Label>> fulfillersMap;
 
   EnvironmentLabels(Label label, Collection<Label> environments, Collection<Label> defaults) {
     this(label, environments, defaults, null);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/FileTarget.java b/src/main/java/com/google/devtools/build/lib/packages/FileTarget.java
index a539e67..72bb473 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/FileTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/FileTarget.java
@@ -27,7 +27,7 @@
  */
 @Immutable
 public abstract class FileTarget implements Target, FileType.HasFileType {
-  protected final Label label;
+  final Label label;
 
   /** Constructs a file with the given label, which must be in the given package. */
   FileTarget(Package pkg, Label label) {
@@ -61,7 +61,7 @@
 
   @Override
   public String toString() {
-    return getTargetKind() + "(" + getLabel() + ")"; // Just for debugging
+    return getTargetKind() + "(" + label + ")"; // Just for debugging
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
index cc625fa..b02e40c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/FilesetEntry.java
@@ -25,7 +25,6 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FilesetEntryApi;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
@@ -41,7 +40,7 @@
 @ThreadSafe
 public final class FilesetEntry implements StarlarkValue, FilesetEntryApi {
 
-  public static final SymlinkBehavior DEFAULT_SYMLINK_BEHAVIOR = SymlinkBehavior.COPY;
+  private static final SymlinkBehavior DEFAULT_SYMLINK_BEHAVIOR = SymlinkBehavior.COPY;
   public static final String DEFAULT_STRIP_PREFIX = ".";
   public static final String STRIP_PREFIX_WORKSPACE = "%workspace%";
 
@@ -50,35 +49,20 @@
     return true;
   }
 
-  public static List<String> makeStringList(List<Label> labels) {
-    if (labels == null) {
-      return Collections.emptyList();
-    }
-    List<String> strings = Lists.newArrayListWithCapacity(labels.size());
-    for (Label label : labels) {
-      strings.add(label.toString());
-    }
-    return strings;
-  }
-
-  public static List<?> makeList(Collection<?> list) {
-    return list == null ? Lists.newArrayList() : Lists.newArrayList(list);
-  }
-
   @Override
   public void repr(Printer printer) {
     printer.append("FilesetEntry(srcdir = ");
-    printer.repr(getSrcLabel().toString());
+    printer.repr(srcLabel.toString());
     printer.append(", files = ");
-    printer.repr(makeStringList(getFiles()));
+    printer.repr(files == null ? ImmutableList.of() : Lists.transform(files, Label::toString));
     printer.append(", excludes = ");
-    printer.repr(makeList(getExcludes()));
+    printer.repr(excludes == null ? ImmutableList.of() : excludes.asList());
     printer.append(", destdir = ");
-    printer.repr(getDestDir().getPathString());
+    printer.repr(destDir.getPathString());
     printer.append(", strip_prefix = ");
-    printer.repr(getStripPrefix());
+    printer.repr(stripPrefix);
     printer.append(", symlinks = ");
-    printer.repr(getSymlinkBehavior().toString());
+    printer.repr(symlinkBehavior.toString());
     printer.append(")");
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java b/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java
index b314d1d..b289dcb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/GlobCache.java
@@ -72,10 +72,9 @@
    */
   private final Predicate<Path> childDirectoryPredicate;
 
-  /**
-   * System call caching layer.
-   */
-  private AtomicReference<? extends UnixGlob.FilesystemCalls> syscalls;
+  /** System call caching layer. */
+  private final AtomicReference<? extends UnixGlob.FilesystemCalls> syscalls;
+
   private final int maxDirectoriesToEagerlyVisit;
 
   /** The thread pool for glob evaluation. */
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 2f63af9..a5e23fe 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -303,7 +303,7 @@
    */
   // It would be nice to unify this with fromTemplates above, but that's not possible because
   // substitutePlaceholderIntoUnsafeTemplate can throw an exception.
-  public static ImplicitOutputsFunction fromUnsafeTemplates(Iterable<String> templates) {
+  private static ImplicitOutputsFunction fromUnsafeTemplates(Iterable<String> templates) {
     return new UnsafeTemplatesImplicitOutputsFunction(templates);
   }
 
@@ -457,7 +457,7 @@
     abstract List<String> attributeNames();
 
     static ParsedTemplate parse(String rawTemplate) {
-      List<String> placeholders = Lists.<String>newArrayList();
+      List<String> placeholders = Lists.newArrayList();
       String formatStr = createPlaceholderSubstitutionFormatString(rawTemplate, placeholders);
       if (placeholders.isEmpty()) {
         placeholders = ImmutableList.of();
@@ -476,7 +476,7 @@
       for (String placeholder : attributeNames()) {
         Set<String> attrValues = attributeGetter.get(attributeMap, placeholder);
         if (attrValues.isEmpty()) {
-          return ImmutableList.<String>of();
+          return ImmutableList.of();
         }
         values.add(attrValues);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/LabelVisitationUtils.java b/src/main/java/com/google/devtools/build/lib/packages/LabelVisitationUtils.java
index 8d3c21c..0eff74a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/LabelVisitationUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/LabelVisitationUtils.java
@@ -91,7 +91,6 @@
 
     if (target instanceof PackageGroup) {
       visitPackageGroup((PackageGroup) target, labelProcessor);
-      return;
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/License.java b/src/main/java/com/google/devtools/build/lib/packages/License.java
index 8bbfa39..3a514e1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/License.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/License.java
@@ -44,7 +44,7 @@
    * The error that's thrown if a build file contains an invalid license string.
    */
   public static class LicenseParsingException extends Exception {
-    public LicenseParsingException(String s) {
+    LicenseParsingException(String s) {
       super(s);
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NoSuchPackageException.java b/src/main/java/com/google/devtools/build/lib/packages/NoSuchPackageException.java
index a7ef140..56f5758 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NoSuchPackageException.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NoSuchPackageException.java
@@ -58,7 +58,7 @@
     return packageId;
   }
 
-  public String getRawMessage() {
+  String getRawMessage() {
     return super.getMessage();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java b/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
index 37c2890..0ba199a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NoSuchTargetException.java
@@ -51,9 +51,10 @@
         /*hasTarget=*/ true);
   }
 
-  public NoSuchTargetException(String message, @Nullable Label label, boolean hasTarget) {
+  private NoSuchTargetException(String message, @Nullable Label label, boolean hasTarget) {
     // TODO(bazel-team): Does the exception matter?
-    super(message,
+    super(
+        message,
         hasTarget ? new BuildFileContainsErrorsException(label.getPackageIdentifier()) : null);
     this.label = label;
     this.hasTarget = hasTarget;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NoSuchThingException.java b/src/main/java/com/google/devtools/build/lib/packages/NoSuchThingException.java
index d4de044..032bbba 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NoSuchThingException.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NoSuchThingException.java
@@ -33,17 +33,17 @@
     this.detailedExitCode = null;
   }
 
-  public NoSuchThingException(String message, Throwable cause) {
+  NoSuchThingException(String message, Throwable cause) {
     super(message, cause);
     this.detailedExitCode = null;
   }
 
-  public NoSuchThingException(String message, DetailedExitCode detailedExitCode) {
+  NoSuchThingException(String message, DetailedExitCode detailedExitCode) {
     super(message);
     this.detailedExitCode = detailedExitCode;
   }
 
-  public NoSuchThingException(String message, Throwable cause, DetailedExitCode detailedExitCode) {
+  NoSuchThingException(String message, Throwable cause, DetailedExitCode detailedExitCode) {
     super(message, cause);
     this.detailedExitCode = detailedExitCode;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
index 6a3c679..058c57e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/OutputFile.java
@@ -78,7 +78,7 @@
 
   @Override
   public Rule getAssociatedRule() {
-    return getGeneratingRule();
+    return generatingRule;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index bf73595..6d55c567d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -868,7 +868,7 @@
     return error.withProperty(DetailedExitCode.class, createDetailedCode(error.toString(), code));
   }
 
-  public static DetailedExitCode createDetailedCode(String errorMessage, Code code) {
+  private static DetailedExitCode createDetailedCode(String errorMessage, Code code) {
     return DetailedExitCode.of(
         FailureDetail.newBuilder()
             .setMessage(errorMessage)
@@ -1324,7 +1324,7 @@
     }
 
     @Nullable
-    public FailureDetail getFailureDetail() {
+    FailureDetail getFailureDetail() {
       if (failureDetailOverride != null) {
         return failureDetailOverride;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageCodecDependencies.java b/src/main/java/com/google/devtools/build/lib/packages/PackageCodecDependencies.java
index fd5a5f2..04213aa 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageCodecDependencies.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageCodecDependencies.java
@@ -20,7 +20,7 @@
   PackageSerializerInterface getPackageSerializer();
 
   /** Simplest implementation of PackageCodecDependencies. */
-  public static class SimplePackageCodecDependencies implements PackageCodecDependencies {
+  class SimplePackageCodecDependencies implements PackageCodecDependencies {
     private final PackageSerializerInterface packageSerializer;
 
     public SimplePackageCodecDependencies(PackageSerializerInterface packageSerializer) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index b1c0054..9da6e4a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -111,7 +111,6 @@
   }
 
   private final RuleFactory ruleFactory;
-  private final ImmutableMap<String, BuiltinRuleFunction> ruleFunctions;
   private final RuleClassProvider ruleClassProvider;
 
   private AtomicReference<? extends UnixGlob.FilesystemCalls> syscalls;
@@ -133,7 +132,7 @@
   /** Builder for {@link PackageFactory} instances. Intended to only be used by unit tests. */
   @VisibleForTesting
   public abstract static class BuilderForTesting {
-    protected final String version = "test";
+    protected static final String VERSION = "test";
     protected Iterable<EnvironmentExtension> environmentExtensions = ImmutableList.of();
     protected PackageValidator packageValidator = PackageValidator.NOOP_VALIDATOR;
     protected PackageOverheadEstimator packageOverheadEstimator =
@@ -193,7 +192,6 @@
       PackageOverheadEstimator packageOverheadEstimator,
       PackageLoadingListener packageLoadingListener) {
     this.ruleFactory = new RuleFactory(ruleClassProvider);
-    this.ruleFunctions = buildRuleFunctions(ruleFactory);
     this.ruleClassProvider = ruleClassProvider;
     this.executor = executorForGlobbing;
     this.environmentExtensions = ImmutableList.copyOf(environmentExtensions);
@@ -205,7 +203,7 @@
     this.bazelStarlarkEnvironment =
         new BazelStarlarkEnvironment(
             ruleClassProvider,
-            ruleFunctions,
+            buildRuleFunctions(ruleFactory),
             this.environmentExtensions,
             newPackageFunction(packageArguments),
             version);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java b/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
index a90289e..dbf46cb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageGroupsRuleVisibility.java
@@ -27,7 +27,7 @@
   private final PackageGroupContents directPackages;
   private final List<Label> declaredLabels;
 
-  public PackageGroupsRuleVisibility(Label ruleLabel, List<Label> labels) {
+  private PackageGroupsRuleVisibility(Label ruleLabel, List<Label> labels) {
     declaredLabels = ImmutableList.copyOf(labels);
     ImmutableList.Builder<PackageSpecification> directPackageBuilder = ImmutableList.builder();
     ImmutableList.Builder<Label> packageGroupBuilder = ImmutableList.builder();
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 c103514..f682618 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
@@ -161,7 +161,7 @@
   @AutoCodec
   @VisibleForSerialization
   static final class SinglePackage extends PackageSpecification {
-    private PackageIdentifier singlePackageName;
+    private final PackageIdentifier singlePackageName;
 
     @VisibleForSerialization
     SinglePackage(PackageIdentifier singlePackageName) {
@@ -204,7 +204,7 @@
   @AutoCodec
   @VisibleForSerialization
   static final class AllPackagesBeneath extends PackageSpecification {
-    private PackageIdentifier prefix;
+    private final PackageIdentifier prefix;
 
     @VisibleForSerialization
     AllPackagesBeneath(PackageIdentifier prefix) {
@@ -348,10 +348,6 @@
       this.allSpecifications = allSpecifications;
     }
 
-    public ImmutableList<PackageSpecification> getPackageSpecifications() {
-      throw new UnsupportedOperationException();
-    }
-
     /**
      * Creates a {@link PackageGroupContents} representing a collection of {@link
      * PackageSpecification}s.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PredicateWithMessage.java b/src/main/java/com/google/devtools/build/lib/packages/PredicateWithMessage.java
index c479788..f04fb27 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PredicateWithMessage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PredicateWithMessage.java
@@ -22,9 +22,8 @@
 public interface PredicateWithMessage<T> extends Predicate<T> {
 
   /**
-   * The error message to display when predicate checks param. Only makes sense to
-   * call this method is apply(param) returns false.
+   * The error message to display when predicate checks param. Only makes sense to call this method
+   * if apply(param) returns false.
    */
-  public String getErrorReason(T param);
-
+  String getErrorReason(T param);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
index 0080e1a..4b82982 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
@@ -40,11 +40,8 @@
 
 /** Shared code used in proto buffer output for rules and rule classes. */
 public class ProtoUtils {
-  /**
-   * This map contains all attribute types that are recognized by the protocol
-   * output formatter.
-   */
-  static final ImmutableMap<Type<?>, Discriminator> TYPE_MAP =
+  /** This map contains all attribute types that are recognized by the protocol output formatter. */
+  private static final ImmutableMap<Type<?>, Discriminator> TYPE_MAP =
       new ImmutableMap.Builder<Type<?>, Discriminator>()
           .put(INTEGER, Discriminator.INTEGER)
           .put(DISTRIBUTIONS, Discriminator.DISTRIBUTION_SET)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Provider.java b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
index b5984fd..35da1d9f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Provider.java
@@ -61,7 +61,7 @@
   Location getLocation();
 
   /** A serializable and fingerprintable representation of {@link Provider}. */
-  public abstract static class Key {
+  abstract class Key {
     abstract void fingerprint(Fingerprint fp);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
index b217481..0884f79 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
@@ -32,7 +32,7 @@
  */
 public class RawAttributeMapper extends AbstractAttributeMapper {
 
-  RawAttributeMapper(Rule rule) {
+  private RawAttributeMapper(Rule rule) {
     super(rule);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
index 0bf6a48d..554bef3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
@@ -144,7 +144,7 @@
       }
 
       @Override
-      public boolean satisfies(
+      boolean satisfies(
           Predicate<Class<? extends TransitiveInfoProvider>> hasBuiltinProvider,
           Predicate<StarlarkProviderIdentifier> hasStarlarkProvider,
           RequiredProviders requiredProviders,
@@ -204,7 +204,7 @@
     };
 
     /** Checks if {@code advertisedProviderSet} satisfies these {@code RequiredProviders} */
-    public abstract boolean satisfies(
+    protected abstract boolean satisfies(
         AdvertisedProviderSet advertisedProviderSet,
         RequiredProviders requiredProviders,
         Builder missing);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index 5fb73a4..3dd861d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.NullEventHandler;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.StarlarkImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.License.DistributionType;
 import com.google.devtools.build.lib.packages.Package.ConfigSettingVisibilityPolicy;
@@ -257,10 +258,9 @@
     Attribute attribute = ruleClass.getAttributeByNameMaybe(attributeName);
     // TODO(murali): This method should be property of ruleclass not rule instance.
     // Further, this call to AbstractAttributeMapper.isConfigurable is delegated right back
-    // to this instance!.
+    // to this instance!
     return attribute != null
-        ? AbstractAttributeMapper.isConfigurable(this, attributeName, attribute.getType())
-        : false;
+        && AbstractAttributeMapper.isConfigurable(this, attributeName, attribute.getType());
   }
 
   /**
@@ -470,7 +470,7 @@
     // TODO(b/151165647): this logic has always been wrong:
     // it spuriously matches occurrences of the package name earlier in the path.
     String absolutePath = location.toString();
-    int pos = absolutePath.indexOf(getLabel().getPackageName());
+    int pos = absolutePath.indexOf(label.getPackageName());
     return (pos < 0) ? null : absolutePath.substring(pos);
   }
 
@@ -496,7 +496,7 @@
     Integer index = ruleClass.getAttributeIndex(attrName);
     if (index == null) {
       throw new IllegalArgumentException(
-          "No such attribute " + attrName + " in " + ruleClass + " rule " + getLabel());
+          "No such attribute " + attrName + " in " + ruleClass + " rule " + label);
     }
     Attribute attr = ruleClass.getAttribute(index);
     if (attr.getType() != type) {
@@ -510,7 +510,7 @@
               + " in "
               + ruleClass
               + " rule "
-              + getLabel());
+              + label);
     }
     return getAttrWithIndex(index);
   }
@@ -539,7 +539,7 @@
               + " in "
               + ruleClass
               + " rule "
-              + getLabel());
+              + label);
     }
     return (BuildType.SelectorList<T>) attrValue;
   }
@@ -644,7 +644,7 @@
    * Check if this rule is valid according to the validityPredicate of its RuleClass.
    */
   void checkValidityPredicate(EventHandler eventHandler) {
-    PredicateWithMessage<Rule> predicate = getRuleClassObject().getValidityPredicate();
+    PredicateWithMessage<Rule> predicate = ruleClass.getValidityPredicate();
     if (!predicate.apply(this)) {
       reportError(predicate.getErrorReason(this), eventHandler);
     }
@@ -660,11 +660,10 @@
         eventHandler, pkgBuilder.getPackageIdentifier(), /*checkLabels=*/ true);
   }
 
-  void populateOutputFilesUnchecked(EventHandler eventHandler, Package.Builder pkgBuilder)
-      throws InterruptedException {
+  void populateOutputFilesUnchecked(Package.Builder pkgBuilder) throws InterruptedException {
     try {
       populateOutputFilesInternal(
-          eventHandler, pkgBuilder.getPackageIdentifier(), /*checkLabels=*/ false);
+          NullEventHandler.INSTANCE, pkgBuilder.getPackageIdentifier(), /*checkLabels=*/ false);
     } catch (LabelSyntaxException e) {
       throw new IllegalStateException(e);
     }
@@ -672,12 +671,12 @@
 
   @FunctionalInterface
   private interface ExplicitOutputHandler {
-    public void accept(Attribute attribute, Label outputLabel) throws LabelSyntaxException;
+    void accept(Attribute attribute, Label outputLabel) throws LabelSyntaxException;
   }
 
   @FunctionalInterface
   private interface ImplicitOutputHandler {
-    public void accept(String outputKey, String outputName);
+    void accept(String outputKey, String outputName);
   }
 
   private void populateOutputFilesInternal(
@@ -711,7 +710,7 @@
               reportError(
                   String.format(
                       "illegal output file name '%s' in rule %s due to: %s",
-                      outputName, getLabel(), e.getMessage()),
+                      outputName, this.label, e.getMessage()),
                   eventHandler);
               return;
             }
@@ -745,8 +744,7 @@
         }
       }
     } catch (EvalException e) {
-      reportError(
-          String.format("In rule %s: %s", getLabel(), e.getMessageWithStack()), eventHandler);
+      reportError(String.format("In rule %s: %s", label, e.getMessageWithStack()), eventHandler);
     }
 
     ExplicitOutputHandler explicitOutputHandler =
@@ -830,7 +828,7 @@
   /** Returns a string of the form "cc_binary rule //foo:foo" */
   @Override
   public String toString() {
-    return getRuleClass() + " rule " + getLabel();
+    return getRuleClass() + " rule " + label;
   }
 
  /**
@@ -847,7 +845,7 @@
     // enforced). See https://github.com/bazelbuild/bazel/issues/12669. Ultimately this entire
     // conditional should be removed.
     if (ruleClass.getName().equals("config_setting")) {
-      ConfigSettingVisibilityPolicy policy = getPackage().getConfigSettingVisibilityPolicy();
+      ConfigSettingVisibilityPolicy policy = pkg.getConfigSettingVisibilityPolicy();
       if (visibility != null) {
         return visibility; // Use explicitly set visibility
       } else if (policy == ConfigSettingVisibilityPolicy.DEFAULT_PUBLIC) {
@@ -879,7 +877,7 @@
         && isAttributeValueExplicitlySpecified("distribs")) {
       return NonconfigurableAttributeMapper.of(this).get("distribs", BuildType.DISTRIBUTIONS);
     } else {
-      return getPackage().getDefaultDistribs();
+      return pkg.getDefaultDistribs();
     }
   }
 
@@ -894,10 +892,10 @@
     } else if (isAttrDefined("licenses", BuildType.LICENSE)
         && isAttributeValueExplicitlySpecified("licenses")) {
       return NonconfigurableAttributeMapper.of(this).get("licenses", BuildType.LICENSE);
-    } else if (getRuleClassObject().ignoreLicenses()) {
+    } else if (ruleClass.ignoreLicenses()) {
       return License.NO_LICENSE;
     } else {
-      return getPackage().getDefaultLicense();
+      return pkg.getDefaultLicense();
     }
   }
 
@@ -919,7 +917,7 @@
    */
   public Set<String> getRuleTags() {
     Set<String> ruleTags = new LinkedHashSet<>();
-    for (Attribute attribute : getRuleClassObject().getAttributes()) {
+    for (Attribute attribute : ruleClass.getAttributes()) {
       if (attribute.isTaggable()) {
         Type<?> attrType = attribute.getType();
         String name = attribute.getName();
@@ -933,10 +931,10 @@
   }
 
   /**
-   * Computes labels of additional dependencies that can be provided by aspects that this rule
-   * can require from its direct dependencies.
+   * Computes labels of additional dependencies that can be provided by aspects that this rule can
+   * require from its direct dependencies.
    */
-  public Collection<? extends Label> getAspectLabelsSuperset(DependencyFilter predicate) {
+  public Collection<Label> getAspectLabelsSuperset(DependencyFilter predicate) {
     if (!hasAspects()) {
       return ImmutableList.of();
     }
@@ -953,7 +951,7 @@
    * @return The repository name.
    */
   public RepositoryName getRepository() {
-    return getLabel().getPackageIdentifier().getRepository();
+    return label.getPackageIdentifier().getRepository();
   }
 
   /** Returns the suffix of target kind for all rules. */
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index a3b628a..0e586b0 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -222,7 +222,7 @@
     INHERIT;
 
     /** Determine the correct value to use based on the current setting and the parent's value. */
-    public ToolchainResolutionMode apply(String name, ToolchainResolutionMode parent) {
+    ToolchainResolutionMode apply(String name, ToolchainResolutionMode parent) {
       if (this == INHERIT) {
         return parent;
       } else if (parent == INHERIT) {
@@ -237,7 +237,7 @@
       return this;
     }
 
-    public boolean isActive() {
+    boolean isActive() {
       switch (this) {
         case ENABLED:
           return true;
@@ -259,7 +259,7 @@
     INHERIT;
 
     /** Determine the correct value to use based on the current setting and the parent's value. */
-    public ToolchainTransitionMode apply(String name, ToolchainTransitionMode parent) {
+    ToolchainTransitionMode apply(String name, ToolchainTransitionMode parent) {
       if (this == INHERIT) {
         return parent;
       } else if (parent == INHERIT) {
@@ -274,7 +274,7 @@
       return this;
     }
 
-    public boolean isActive() {
+    boolean isActive() {
       switch (this) {
         case ENABLED:
           return true;
@@ -549,12 +549,12 @@
       public abstract void checkName(String name);
 
       /**
-       * Checks whether the given set of attributes contains all the required
-       * attributes for the current rule class type.
+       * Checks whether the given set of attributes contains all the required attributes for the
+       * current rule class type.
        *
        * @throws IllegalArgumentException if a required attribute is missing
        */
-      public abstract void checkAttributes(Map<String, Attribute> attributes);
+      protected abstract void checkAttributes(Map<String, Attribute> attributes);
     }
 
     /** A predicate that filters rule classes based on their names. */
@@ -723,17 +723,17 @@
      */
     public static final String STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME = "build_setting_default";
 
-    public static final String STARLARK_BUILD_SETTING_HELP_ATTR_NAME = "help";
+    static final String STARLARK_BUILD_SETTING_HELP_ATTR_NAME = "help";
 
-    public static final String BUILD_SETTING_DEFAULT_NONCONFIGURABLE =
+    static final String BUILD_SETTING_DEFAULT_NONCONFIGURABLE =
         "Build setting defaults are referenced during analysis.";
 
     /** List of required attributes for normal rules, name and type. */
-    public static final ImmutableList<Attribute> REQUIRED_ATTRIBUTES_FOR_NORMAL_RULES =
+    static final ImmutableList<Attribute> REQUIRED_ATTRIBUTES_FOR_NORMAL_RULES =
         ImmutableList.of(attr("tags", Type.STRING_LIST).build());
 
     /** List of required attributes for test rules, name and type. */
-    public static final ImmutableList<Attribute> REQUIRED_ATTRIBUTES_FOR_TESTS =
+    static final ImmutableList<Attribute> REQUIRED_ATTRIBUTES_FOR_TESTS =
         ImmutableList.of(
             attr("tags", Type.STRING_LIST).build(),
             attr("size", Type.STRING).build(),
@@ -759,8 +759,7 @@
     private ImplicitOutputsFunction implicitOutputsFunction = ImplicitOutputsFunction.NONE;
     private TransitionFactory<Rule> transitionFactory;
     private ConfiguredTargetFactory<?, ?, ?> configuredTargetFactory = null;
-    private PredicateWithMessage<Rule> validityPredicate =
-        PredicatesWithMessage.<Rule>alwaysTrue();
+    private PredicateWithMessage<Rule> validityPredicate = PredicatesWithMessage.alwaysTrue();
     private Predicate<String> preferredDependencyPredicate = Predicates.alwaysFalse();
     private final AdvertisedProviderSet.Builder advertisedProviders =
         AdvertisedProviderSet.builder();
@@ -1035,7 +1034,7 @@
      */
     public Builder requiresConfigurationFragments(Class<?>... configurationFragments) {
       configurationFragmentPolicy.requiresConfigurationFragments(
-          ImmutableSet.<Class<?>>copyOf(configurationFragments));
+          ImmutableSet.copyOf(configurationFragments));
       return this;
     }
 
@@ -1053,8 +1052,7 @@
     public Builder requiresConfigurationFragments(ConfigurationTransition transition,
         Class<?>... configurationFragments) {
       configurationFragmentPolicy.requiresConfigurationFragments(
-          transition,
-          ImmutableSet.<Class<?>>copyOf(configurationFragments));
+          transition, ImmutableSet.copyOf(configurationFragments));
       return this;
     }
 
@@ -1175,7 +1173,7 @@
      * #cfg(TransitionFactory)}.
      */
     public Builder cfg(PatchTransition transition) {
-      return cfg((TransitionFactory<Rule>) unused -> transition);
+      return cfg(unused -> transition);
     }
 
     /**
@@ -2112,7 +2110,7 @@
     Rule rule =
         pkgBuilder.createRule(ruleLabel, this, location, callstack, implicitOutputsFunction);
     populateRuleAttributeValues(rule, pkgBuilder, attributeValues, NullEventHandler.INSTANCE);
-    rule.populateOutputFilesUnchecked(NullEventHandler.INSTANCE, pkgBuilder);
+    rule.populateOutputFilesUnchecked(pkgBuilder);
     return rule;
   }
 
@@ -2335,7 +2333,7 @@
     // attribute gets an '$implicit_tests' attribute, whose value is a shared per-package list of
     // all test labels, populated later.
     // TODO(blaze-rules-team): This should be in test_suite's implementation, not here.
-    if (this.name.equals("test_suite") && !this.isStarlark()) {
+    if (this.name.equals("test_suite") && !this.isStarlark) {
       Attribute implicitTests = this.getAttributeByName("$implicit_tests");
       NonconfigurableAttributeMapper attributeMapper = NonconfigurableAttributeMapper.of(rule);
       if (implicitTests != null && attributeMapper.get("tests", BuildType.LABEL_LIST).isEmpty()) {
@@ -2780,6 +2778,6 @@
   // https://docs.google.com/document/d/1uwBuhAoBNrw8tmFs-NxlssI6VRolidGYdYqagLqHWt8/edit#
   // TODO(b/183637322) consider this further
   public boolean isBazelLicense() {
-    return getName().equals("_license") && hasAttr("license_kinds", BuildType.LABEL_LIST);
+    return name.equals("_license") && hasAttr("license_kinds", BuildType.LABEL_LIST);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleCodec.java b/src/main/java/com/google/devtools/build/lib/packages/RuleCodec.java
index 18597b5..8b1bd3c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleCodec.java
@@ -21,7 +21,6 @@
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
 import com.google.protobuf.CodedInputStream;
 import com.google.protobuf.CodedOutputStream;
-import java.io.IOException;
 
 /**
  * Codec for {@link Rule} that throws. We expect never to serialize Rule except for in PackageCodec,
@@ -45,13 +44,13 @@
 
   @Override
   public void serialize(SerializationContext context, Rule obj, CodedOutputStream codedOut)
-      throws SerializationException, IOException {
+      throws SerializationException {
     throw new SerializationException(String.format(SERIALIZATION_ERROR_TEMPLATE, obj));
   }
 
   @Override
   public Rule deserialize(DeserializationContext context, CodedInputStream codedIn)
-      throws SerializationException, IOException {
+      throws SerializationException {
     throw new SerializationException(DESERIALIZATION_ERROR_TEMPLATE);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java b/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
index 7a66a7c..799b050 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SelectorList.java
@@ -131,7 +131,7 @@
 
     for (Object value : values) {
       if (value instanceof SelectorList) {
-        elements.addAll(((SelectorList) value).getElements());
+        elements.addAll(((SelectorList) value).elements);
       } else {
         elements.add(value);
       }
@@ -152,7 +152,7 @@
 
   private static String getTypeName(Object x) {
     if (x instanceof SelectorList) {
-      return "select of " + Depset.ElementType.of(((SelectorList) x).getType());
+      return "select of " + Depset.ElementType.of(((SelectorList) x).type);
     } else if (x instanceof SelectorValue) {
       return "select of " + Depset.ElementType.of(((SelectorValue) x).getType());
     } else {
@@ -162,7 +162,7 @@
 
   private static Class<?> getNativeType(Object value) {
     if (value instanceof SelectorList) {
-      return ((SelectorList) value).getType();
+      return ((SelectorList) value).type;
     } else if (value instanceof SelectorValue) {
       return ((SelectorValue) value).getType();
     } else {
@@ -177,11 +177,8 @@
   private static boolean canConcatenate(Class<?> type1, Class<?> type2) {
     if (type1 == type2) {
       return true;
-    } else if (isListType(type1) && isListType(type2)) {
-      return true;
-    } else {
-      return false;
     }
+    return isListType(type1) && isListType(type2);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspectClass.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspectClass.java
index 9bde830..bf0b414 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspectClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkAspectClass.java
@@ -40,12 +40,12 @@
   }
 
   @Override
-  public final String getName() {
-    return getExtensionLabel() + "%" + getExportedName();
+  public String getName() {
+    return extensionLabel + "%" + exportedName;
   }
 
   @Override
-  public final boolean equals(Object o) {
+  public boolean equals(Object o) {
     if (this == o) {
       return true;
     }
@@ -61,8 +61,8 @@
   }
 
   @Override
-  public final int hashCode() {
-    return Objects.hash(getExtensionLabel(), getExportedName());
+  public int hashCode() {
+    return Objects.hash(extensionLabel, exportedName);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
index 4562a99..77bd274 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkDefinedAspect.java
@@ -342,7 +342,7 @@
         && Objects.equals(hostTransition, that.hostTransition)
         && Objects.equals(hostFragments, that.hostFragments)
         && Objects.equals(requiredToolchains, that.requiredToolchains)
-        && Objects.equals(useToolchainTransition, that.useToolchainTransition)
+        && useToolchainTransition == that.useToolchainTransition
         && Objects.equals(aspectClass, that.aspectClass);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
index 55aae7f..7a973de 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkInfo.java
@@ -264,7 +264,7 @@
   @Override
   public boolean isImmutable() {
     // If the provider is not yet exported, the hash code of the object is subject to change.
-    if (!getProvider().isExported()) {
+    if (!provider.isExported()) {
       return false;
     }
     for (int i = table.length / 2; i < table.length; i++) {
@@ -350,8 +350,8 @@
   }
 
   private static StarlarkInfo plus(StarlarkInfo x, StarlarkInfo y) throws EvalException {
-    Provider xprov = x.getProvider();
-    Provider yprov = y.getProvider();
+    Provider xprov = x.provider;
+    Provider yprov = y.provider;
     if (!xprov.equals(yprov)) {
       throw Starlark.errorf(
           "Cannot use '+' operator on instances of different providers (%s and %s)",
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
index 5f25557..07f255f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
@@ -169,7 +169,7 @@
       private void field(String name, Object v) throws EvalException {
         // dict?
         if (v instanceof Dict) {
-          Dict<?, ?> dict = (Dict) v;
+          Dict<?, ?> dict = (Dict<?, ?>) v;
           for (Map.Entry<?, ?> entry : dict.entrySet()) {
             Object key = entry.getKey();
             if (!(key instanceof String || key instanceof StarlarkInt)) {
@@ -194,7 +194,7 @@
         // list or tuple?
         if (v instanceof Sequence) {
           int i = 0;
-          for (Object item : (Sequence) v) {
+          for (Object item : (Sequence<?>) v) {
             try {
               fieldElement(name, item);
             } catch (EvalException ex) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
index bc1e62b..438b6b2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
@@ -359,7 +359,7 @@
 
     if (val instanceof List) {
       List<Object> l = new ArrayList<>();
-      for (Object o : (List) val) {
+      for (Object o : (List<?>) val) {
         Object elt = starlarkifyValue(mu, o, pkg);
         if (elt == null) {
           continue;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
index 520054b..1256093 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProvider.java
@@ -126,7 +126,7 @@
 
   @Override
   public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
-      throws EvalException, InterruptedException {
+      throws EvalException {
     if (positional.length > 0) {
       throw Starlark.errorf("%s: unexpected positional arguments", getName());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
index cf30856..282e5e0 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
@@ -220,7 +220,7 @@
     } else if (value instanceof List) {
       sb.append("[");
       String join = "";
-      for (Object item : ((List) value)) {
+      for (Object item : ((List<?>) value)) {
         sb.append(join);
         join = ",";
         printJson(item, sb, "list element in struct field", key);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index 5221315..e05ac93 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -290,9 +290,8 @@
                     String.class,
                     "execution_requirements"));
 
-    Map<String, String> executionInfoBuilder = new HashMap<>();
     // adding filtered execution requirements to the execution info map
-    executionInfoBuilder.putAll(checkedExecutionRequirements);
+    Map<String, String> executionInfoBuilder = new HashMap<>(checkedExecutionRequirements);
 
     if (allowTagsPropagation) {
       Map<String, String> checkedTags = getExecutionInfo(rule);
@@ -307,7 +306,7 @@
    * Returns the execution info. These include execution requirement tags ('block-*', 'requires-*',
    * 'no-*', 'supports-*', 'disable-*', 'local', and 'cpu:*') as keys with empty values.
    */
-  public static Map<String, String> filter(Map<String, String> executionInfo) {
+  private static Map<String, String> filter(Map<String, String> executionInfo) {
     return Maps.filterKeys(executionInfo, TargetUtils::legalExecInfoKeys);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TestSize.java b/src/main/java/com/google/devtools/build/lib/packages/TestSize.java
index b43f60f..a9cd8f8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TestSize.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TestSize.java
@@ -48,7 +48,7 @@
   private final TestTimeout timeout;
   private final int defaultShards;
 
-  private TestSize(TestTimeout defaultTimeout, int defaultShards) {
+  TestSize(TestTimeout defaultTimeout, int defaultShards) {
     this.timeout = defaultTimeout;
     this.defaultShards = defaultShards;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TestTargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TestTargetUtils.java
index 245177a..d6e2d2e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TestTargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TestTargetUtils.java
@@ -128,11 +128,9 @@
         excludedTags.add(tag.substring(1));
       } else if (tag.startsWith("+")) {
         requiredTags.add(tag.substring(1));
-      } else if (tag.equals("manual")) {
-        // Ignore manual attribute because it is an exception: it is not a filter
-        // but a property of test_suite
-        continue;
-      } else {
+      } else if (!tag.equals("manual")) {
+        // Ignore manual attribute because it is an exception: it is not a filter but a property of
+        // test_suite.
         requiredTags.add(tag);
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TestTimeout.java b/src/main/java/com/google/devtools/build/lib/packages/TestTimeout.java
index 1c24197..0b17a47 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TestTimeout.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TestTimeout.java
@@ -110,7 +110,7 @@
 
   private final int timeout;
 
-  private TestTimeout(int timeout) {
+  TestTimeout(int timeout) {
     this.timeout = timeout;
   }
 
@@ -202,7 +202,7 @@
         // so we can't fully emulate String.split(String, 0).
         if (!token.isEmpty() || values.size() > 1) {
           try {
-            values.add(Duration.ofSeconds(Integer.valueOf(token)));
+            values.add(Duration.ofSeconds(Integer.parseInt(token)));
           } catch (NumberFormatException e) {
             throw new OptionsParsingException("'" + input + "' is not an int");
           }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java
index 4f66ce3..8bdd1b2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Type.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java
@@ -86,7 +86,7 @@
 // types, both Starlark and native.
 public abstract class Type<T> {
 
-  protected Type() {}
+  Type() {}
 
   /**
    * Converts a legal Starlark value x into an Java value of type T.
@@ -285,7 +285,7 @@
     }
 
     /** Contructs a conversion error. Throws NullPointerException if value is null. */
-    public ConversionException(Type<?> type, Object value, @Nullable Object what) {
+    ConversionException(Type<?> type, Object value, @Nullable Object what) {
       super(message(type, Preconditions.checkNotNull(value), what));
     }
 
@@ -523,7 +523,7 @@
       return new DictType<>(keyType, valueType, labelClass);
     }
 
-    protected DictType(Type<KeyT> keyType, Type<ValueT> valueType, LabelClass labelClass) {
+    DictType(Type<KeyT> keyType, Type<ValueT> valueType, LabelClass labelClass) {
       this.keyType = keyType;
       this.valueType = valueType;
       this.labelClass = labelClass;
@@ -738,7 +738,7 @@
         throws ConversionException {
       // TODO(adonovan): converge on Starlark.toIterable.
       if (x instanceof Sequence) {
-        return ((Sequence) x).getImmutableList();
+        return ((Sequence<Object>) x).getImmutableList();
       } else if (x instanceof List) {
         return (List<Object>) x;
       } else if (x instanceof Iterable) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index c7b60c9..f46a53f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -56,8 +56,6 @@
   private final Path defaultSystemJavabaseDir;
   private final Mutability mutability;
 
-  private final RuleFactory ruleFactory;
-
   private final WorkspaceGlobals workspaceGlobals;
   private final StarlarkSemantics starlarkSemantics;
   private final ImmutableMap<String, Object> workspaceFunctions;
@@ -93,7 +91,7 @@
     this.workspaceDir = workspaceDir;
     this.defaultSystemJavabaseDir = defaultSystemJavabaseDir;
     this.environmentExtensions = environmentExtensions;
-    this.ruleFactory = new RuleFactory(ruleClassProvider);
+    RuleFactory ruleFactory = new RuleFactory(ruleClassProvider);
     this.workspaceGlobals = new WorkspaceGlobals(allowOverride, ruleFactory);
     this.starlarkSemantics = starlarkSemantics;
     this.workspaceFunctions =
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
index 39997b6..233dd0c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
@@ -35,7 +35,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
 import net.starlark.java.eval.Dict;
@@ -86,7 +85,7 @@
     Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
     RuleClass localRepositoryRuleClass = ruleFactory.getRuleClass("local_repository");
     RuleClass bindRuleClass = ruleFactory.getRuleClass("bind");
-    Map<String, Object> kwargs = ImmutableMap.<String, Object>of("name", name, "path", ".");
+    Map<String, Object> kwargs = ImmutableMap.of("name", name, "path", ".");
     try {
       // This effectively adds a "local_repository(name = "<ws>", path = ".")"
       // definition to the WORKSPACE file.
@@ -110,7 +109,7 @@
 
   @Override
   public void dontSymlinkDirectoriesInExecroot(Sequence<?> paths, StarlarkThread thread)
-      throws EvalException, InterruptedException {
+      throws EvalException {
     List<String> pathsList = Sequence.cast(paths, String.class, "paths");
     Set<String> set = Sets.newHashSet();
     for (String path : pathsList) {
@@ -245,7 +244,7 @@
 
   @Override
   public void registerExecutionPlatforms(Sequence<?> platformLabels, StarlarkThread thread)
-      throws EvalException, InterruptedException {
+      throws EvalException {
     // Add to the package definition for later.
     Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
     List<String> patterns = Sequence.cast(platformLabels, String.class, "platform_labels");
@@ -254,7 +253,7 @@
 
   @Override
   public void registerToolchains(Sequence<?> toolchainLabels, StarlarkThread thread)
-      throws EvalException, InterruptedException {
+      throws EvalException {
     // Add to the package definition for later.
     Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
     List<String> patterns = Sequence.cast(toolchainLabels, String.class, "toolchain_labels");
@@ -289,7 +288,6 @@
    * Returns true if the given name is a valid workspace name.
    */
   public static boolean isLegalWorkspaceName(String name) {
-    Matcher matcher = LEGAL_WORKSPACE_NAME.matcher(name);
-    return matcher.matches();
+    return LEGAL_WORKSPACE_NAME.matcher(name).matches();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/metrics/ExtremaPackageMetricsRecorder.java b/src/main/java/com/google/devtools/build/lib/packages/metrics/ExtremaPackageMetricsRecorder.java
index dc1a3bf..475344a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/metrics/ExtremaPackageMetricsRecorder.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/metrics/ExtremaPackageMetricsRecorder.java
@@ -173,7 +173,7 @@
             largestPackages.getExtremeElements().stream(),
             packagesWithMostTransitiveLoads.getExtremeElements().stream(),
             packagesWithMostOverhead.getExtremeElements().stream())
-        .map(c -> c.getPackageMetrics())
+        .map(PackageMetricsContainer::getPackageMetrics)
         .collect(toImmutableSet());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
index 038801e..053acc4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsPackageLoadingListener.java
@@ -24,7 +24,7 @@
 public class PackageMetricsPackageLoadingListener implements PackageLoadingListener {
 
   @GuardedBy("this")
-  private PackageMetricsRecorder recorder = null;
+  private PackageMetricsRecorder recorder;
 
   @GuardedBy("PackageMetricsPackageLoadingListener.class")
   private static PackageMetricsPackageLoadingListener instance = null;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsRecorder.java b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsRecorder.java
index b2c8819..79ea6c6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsRecorder.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/metrics/PackageMetricsRecorder.java
@@ -22,7 +22,7 @@
 public interface PackageMetricsRecorder {
 
   /** What type of packages are metrics being recorded for? */
-  public enum Type {
+  enum Type {
     ONLY_EXTREMES,
     ALL,
   }
