diff --git a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
index 583e0c5..5e3ca13 100644
--- a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
+++ b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
@@ -95,8 +95,8 @@
     for (Entry<String, Object> entry : globals.entrySet()) {
       String name = entry.getKey();
       Object obj = entry.getValue();
-      if (obj instanceof GuardedValue) {
-        obj = ((GuardedValue) obj).getObject();
+      if (obj instanceof GuardedValue guardedValue) {
+        obj = guardedValue.getObject();
       }
 
       Value.Builder value = Value.newBuilder();
@@ -175,8 +175,8 @@
     }
 
     // annotated Java method?
-    if (x instanceof BuiltinFunction) {
-      return valueFromAnnotation(((BuiltinFunction) x).getAnnotation());
+    if (x instanceof BuiltinFunction builtinFunction) {
+      return valueFromAnnotation(builtinFunction.getAnnotation());
     }
 
     // application-defined callable?  Treat as def f(**kwargs).
diff --git a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
index 3169b37..a94ae5e 100644
--- a/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
+++ b/src/main/java/com/google/devtools/build/docgen/RuleDocumentationAttribute.java
@@ -230,8 +230,8 @@
       // We cannot print anything useful here other than "optional". Let's assume the doc string for
       // the attribute explains the details.
       return null;
-    } else if (value instanceof TriState) {
-      switch ((TriState) value) {
+    } else if (value instanceof TriState triState) {
+      switch (triState) {
         case AUTO:
           return "-1";
         case NO:
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
index 60d2cce..6b8dcb7 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java
@@ -253,8 +253,8 @@
 
   @Override
   public Collection<Artifact> getOutputs() {
-    return outputs instanceof Artifact
-        ? ImmutableSet.of((Artifact) outputs)
+    return outputs instanceof Artifact artifact
+        ? ImmutableSet.of(artifact)
         : new OutputSet((Artifact[]) outputs);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
index 3c94a5d..9cd1247 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java
@@ -534,8 +534,8 @@
           action.discoversInputs(),
           "Actions that don't know their inputs must discover them: %s",
           action);
-      if (action instanceof ActionCacheAwareAction
-          && ((ActionCacheAwareAction) action).storeInputsExecPathsInActionCache()) {
+      if (action instanceof ActionCacheAwareAction actionCacheAwareAction
+          && actionCacheAwareAction.storeInputsExecPathsInActionCache()) {
         actionInputs = NestedSetBuilder.wrap(Order.STABLE_ORDER, resolvedCacheArtifacts);
       } else {
         actionInputs =
@@ -764,8 +764,8 @@
     }
 
     boolean storeAllInputsInActionCache =
-        action instanceof ActionCacheAwareAction
-            && ((ActionCacheAwareAction) action).storeInputsExecPathsInActionCache();
+        action instanceof ActionCacheAwareAction actionCacheAwareAction
+            && actionCacheAwareAction.storeInputsExecPathsInActionCache();
     ImmutableSet<Artifact> excludePathsFromActionCache =
         !storeAllInputsInActionCache && action.discoversInputs()
             ? action.getMandatoryInputs().toSet()
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java
index f643093..dae7730 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutedEvent.java
@@ -262,8 +262,8 @@
       }
     }
     try {
-      if (action instanceof CommandAction) {
-        actionBuilder.addAllCommandLine(((CommandAction) action).getArguments());
+      if (action instanceof CommandAction commandAction) {
+        actionBuilder.addAllCommandLine(commandAction.getArguments());
       }
     } catch (CommandLineExpansionException e) {
       // Command-line not available, so just not report it
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java
index 3dc0a28..8232e8d 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionContext.java
@@ -508,8 +508,8 @@
     try {
       fileOutErr.close();
     } finally {
-      if (actionFileSystem instanceof Closeable) {
-        ((Closeable) actionFileSystem).close();
+      if (actionFileSystem instanceof Closeable closeable) {
+        closeable.close();
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
index 0ea88b8..80466db 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionException.java
@@ -143,8 +143,8 @@
 
     DetailedExitCode code =
         DetailedExitCode.of(exception.getFailureDetail(action.describe() + " failed: " + message));
-    if (exception instanceof LostInputsExecException) {
-      return ((LostInputsExecException) exception).fromExecException(message, action, code);
+    if (exception instanceof LostInputsExecException lostInputsExecException) {
+      return lostInputsExecException.fromExecException(message, action, code);
     }
 
     return fromExecException(exception, message, action, code);
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
index 214f2aa..e245427 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java
@@ -157,8 +157,8 @@
     Preconditions.checkNotNull(input, "input");
     Preconditions.checkNotNull(execRoot, "execRoot");
 
-    return (input instanceof Artifact)
-        ? ((Artifact) input).getPath()
+    return input instanceof Artifact artifact
+        ? artifact.getPath()
         : execRoot.getRelative(input.getExecPath());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index f9613fd..9bfb78b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -374,8 +374,8 @@
      * consistent across calls to {@link #setGeneratingActionKey} and also serialization.
      */
     private static Object getOwnerToUseForHashCode(Object owner) {
-      return owner instanceof ActionLookupData
-          ? ((ActionLookupData) owner).getActionLookupKey()
+      return owner instanceof ActionLookupData actionLookupData
+          ? actionLookupData.getActionLookupKey()
           : owner;
     }
 
@@ -1408,8 +1408,8 @@
 
     @Override
     public boolean equals(Object obj) {
-      return obj instanceof OwnerlessArtifactWrapper
-          && this.artifact.equalsWithoutOwner(((OwnerlessArtifactWrapper) obj).artifact);
+      return obj instanceof OwnerlessArtifactWrapper ownerlessArtifactWrapper
+          && this.artifact.equalsWithoutOwner(ownerlessArtifactWrapper.artifact);
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactPathResolver.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactPathResolver.java
index 08a7e67..6355c8b 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactPathResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactPathResolver.java
@@ -73,8 +73,8 @@
 
     @Override
     public Path toPath(ActionInput actionInput) {
-      if (actionInput instanceof Artifact) {
-        return ((Artifact) actionInput).getPath();
+      if (actionInput instanceof Artifact artifact) {
+        return artifact.getPath();
       }
       return execRoot.getRelative(actionInput.getExecPath());
     }
@@ -104,8 +104,8 @@
 
     @Override
     public Path toPath(ActionInput input) {
-      if (input instanceof Artifact) {
-        return fileSystem.getPath(((Artifact) input).getPath().asFragment());
+      if (input instanceof Artifact artifact) {
+        return fileSystem.getPath(artifact.getPath().asFragment());
       }
       return execRoot.getRelative(input.getExecPath());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/CommandLineItem.java b/src/main/java/com/google/devtools/build/lib/actions/CommandLineItem.java
index 5845a14..3fb66a2 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/CommandLineItem.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/CommandLineItem.java
@@ -96,8 +96,8 @@
     // Since StarlarkValue should be moved out of Bazel, this refactoring would be blocked on making
     // a BuildStarlarkValue subinterface for Bazel-specific Starlark types. It would then be
     // BuildStarlarkValue, rather than StarlarkValue, that extends CommandLineItem.
-    if (object instanceof CommandLineItem) {
-      return ((CommandLineItem) object).expandToCommandLine();
+    if (object instanceof CommandLineItem commandLineItem) {
+      return commandLineItem.expandToCommandLine();
     } else {
       return object.toString();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/CommandLines.java b/src/main/java/com/google/devtools/build/lib/actions/CommandLines.java
index 905d45f..0ea0307 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/CommandLines.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/CommandLines.java
@@ -499,8 +499,8 @@
         CommandLine commandLine;
         ParamFileInfo paramFileInfo = null;
 
-        if (obj instanceof CommandLine) {
-          commandLine = (CommandLine) obj;
+        if (obj instanceof CommandLine c) {
+          commandLine = c;
           if (i + 1 < commandLines.length && commandLines[i + 1] instanceof ParamFileInfo) {
             paramFileInfo = (ParamFileInfo) commandLines[++i];
           }
@@ -530,8 +530,8 @@
     public Iterable<String> arguments(
         @Nullable ArtifactExpander artifactExpander, PathMapper pathMapper)
         throws CommandLineExpansionException, InterruptedException {
-      if (arg instanceof PathStrippable) {
-        return ImmutableList.of(((PathStrippable) arg).expand(pathMapper::map));
+      if (arg instanceof PathStrippable pathStrippable) {
+        return ImmutableList.of(pathStrippable.expand(pathMapper::map));
       }
       return ImmutableList.of(CommandLineItem.expandToCommandLine(arg));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/actions/HasDigest.java b/src/main/java/com/google/devtools/build/lib/actions/HasDigest.java
index b4951bc..671dbaa 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/HasDigest.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/HasDigest.java
@@ -38,8 +38,8 @@
 
     @Override
     public boolean equals(Object other) {
-      if (other instanceof ByteStringDigest) {
-        return bytes.equals(((ByteStringDigest) other).bytes);
+      if (other instanceof ByteStringDigest byteStringDigest) {
+        return bytes.equals(byteStringDigest.bytes);
       }
       return false;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
index a35d112..2176762 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BazelRuleAnalysisThreadContext.java
@@ -63,8 +63,8 @@
   public static BazelRuleAnalysisThreadContext fromOrFail(StarlarkThread thread, String what)
       throws EvalException {
     BazelStarlarkContext ctx = thread.getThreadLocal(BazelStarlarkContext.class);
-    if (ctx instanceof BazelRuleAnalysisThreadContext) {
-      return (BazelRuleAnalysisThreadContext) ctx;
+    if (ctx instanceof BazelRuleAnalysisThreadContext bazelRuleAnalysisThreadContext) {
+      return bazelRuleAnalysisThreadContext;
     }
     throw Starlark.errorf("%s can only be called from a rule or aspect implementation", what);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 4525afb..ed90264 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -775,8 +775,8 @@
     for (Artifact.DerivedArtifact artifact :
         provider.getTransitiveExtraActionArtifacts().toList()) {
       ActionLookupKey owner = artifact.getArtifactOwner();
-      if (owner instanceof AspectKey) {
-        if (aspectClasses.contains(((AspectKey) owner).getAspectClass())) {
+      if (owner instanceof AspectKey aspectKey) {
+        if (aspectClasses.contains(aspectKey.getAspectClass())) {
           artifacts.add(artifact);
         }
       }
@@ -798,8 +798,8 @@
       final boolean isExclusive = topLevelOptions.runTestsExclusively();
       for (ConfiguredTarget configuredTarget : allTestTargets) {
         Target target = labelToTargetMap.get(configuredTarget.getLabel());
-        if (target instanceof Rule) {
-          if (isExclusive || TargetUtils.isExclusiveTestRule((Rule) target)) {
+        if (target instanceof Rule rule) {
+          if (isExclusive || TargetUtils.isExclusiveTestRule(rule)) {
             exclusiveTests.add(configuredTarget);
           } else if (TargetUtils.isExclusiveIfLocalTestRule((Rule) target)
               && TargetUtils.isLocalTestRule((Rule) target)) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index 8581418..a5cbbae 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -198,8 +198,8 @@
       // Initialize every StarlarkApiProvider
       for (int i = 0; i < providerMap.getProviderCount(); i++) {
         Object obj = providerMap.getProviderInstanceAt(i);
-        if (obj instanceof StarlarkApiProvider) {
-          ((StarlarkApiProvider) obj).init(providerMap);
+        if (obj instanceof StarlarkApiProvider starlarkApiProvider) {
+          starlarkApiProvider.init(providerMap);
         }
       }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolutionHelpers.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolutionHelpers.java
index 21476a6..916cf03 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolutionHelpers.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolutionHelpers.java
@@ -112,12 +112,12 @@
       addToolchainDeps(toolchainContexts, outgoingLabels);
     } else if (target instanceof InputFile || target instanceof EnvironmentGroup) {
       addVisibilityDepLabels(target.getVisibilityDependencyLabels(), outgoingLabels);
-    } else if (target instanceof Rule) {
-      fromRule = (Rule) target;
+    } else if (target instanceof Rule rule) {
+      fromRule = rule;
       attributeMap = ConfiguredAttributeMapper.of(fromRule, configConditions, config);
       visitRule(node, aspects, attributeMap, toolchainContexts, outgoingLabels);
-    } else if (target instanceof PackageGroup) {
-      outgoingLabels.putAll(VISIBILITY_DEPENDENCY, ((PackageGroup) target).getIncludes());
+    } else if (target instanceof PackageGroup packageGroup) {
+      outgoingLabels.putAll(VISIBILITY_DEPENDENCY, packageGroup.getIncludes());
     } else {
       throw new IllegalStateException(target.getLabel().toString());
     }
@@ -372,8 +372,8 @@
         Object defaultValue = attribute.getDefaultValue(rule);
         attributeValue =
             type.cast(
-                defaultValue instanceof ComputedDefault
-                    ? ((ComputedDefault) defaultValue).getDefault(attributeMap)
+                defaultValue instanceof ComputedDefault computedDefault
+                    ? computedDefault.getDefault(attributeMap)
                     : defaultValue);
       }
     } else if (attribute.isLateBound()) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
index 72b778a..4cc129d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PackageSpecificationProvider.java
@@ -99,10 +99,10 @@
   @Override
   public boolean targetInAllowlist(Object target) throws EvalException, LabelSyntaxException {
     Label targetLabel;
-    if (target instanceof String) {
-      targetLabel = Label.parseCanonical((String) target);
-    } else if (target instanceof Label) {
-      targetLabel = (Label) target;
+    if (target instanceof String string) {
+      targetLabel = Label.parseCanonical(string);
+    } else if (target instanceof Label label) {
+      targetLabel = label;
     } else {
       throw Starlark.errorf(
           "expected string or label for 'target' instead of %s", Starlark.type(target));
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 56e2f14..234b3aa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1608,10 +1608,10 @@
 
         // TODO(adonovan): define in terms of Starlark.len?
         boolean isEmpty = false;
-        if (attributeValue instanceof List) {
-          isEmpty = ((List<?>) attributeValue).isEmpty();
-        } else if (attributeValue instanceof Map) {
-          isEmpty = ((Map<?, ?>) attributeValue).isEmpty();
+        if (attributeValue instanceof List<?> list) {
+          isEmpty = list.isEmpty();
+        } else if (attributeValue instanceof Map<?, ?> map) {
+          isEmpty = map.isEmpty();
         }
         if (isEmpty) {
           reporter.attributeError(attr.getName(), "attribute must be non empty");
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
index ae63d1b..88e2eff 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/CustomCommandLine.java
@@ -379,8 +379,8 @@
         // It'd be nice to build this into ActionInput's CommandLine interface so we don't have
         // to explicitly check if an object is a ActionInput. Unfortunately that would require
         // a lot more dependencies on the Java library ActionInput is built into.
-        return pathMapper != null && object instanceof ActionInput
-            ? pathMapper.getMappedExecPathString((ActionInput) object)
+        return pathMapper != null && object instanceof ActionInput actionInput
+            ? pathMapper.getMappedExecPathString(actionInput)
             : CommandLineItem.expandToCommandLine(object);
       }
 
@@ -1298,11 +1298,11 @@
     String previousFlag = null;
     for (int i = 0; i < count; ) {
       Object arg = arguments.get(i++);
-      if (arg instanceof TreeFileArtifactArgvFragment) {
-        arg = substituteTreeFileArtifactArgvFragment((TreeFileArtifactArgvFragment) arg);
+      if (arg instanceof TreeFileArtifactArgvFragment treeFileArtifactArgvFragment) {
+        arg = substituteTreeFileArtifactArgvFragment(treeFileArtifactArgvFragment);
       }
-      if (arg instanceof NestedSet) {
-        evalSimpleVectorArg(((NestedSet<?>) arg).toList(), builder, pathMapper, previousFlag);
+      if (arg instanceof NestedSet<?> nestedSet) {
+        evalSimpleVectorArg(nestedSet.toList(), builder, pathMapper, previousFlag);
       } else if (arg instanceof Iterable) {
         evalSimpleVectorArg((Iterable<?>) arg, builder, pathMapper, previousFlag);
       } else if (arg instanceof ArgvFragment) {
@@ -1312,17 +1312,17 @@
         } else {
           i = ((ArgvFragment) arg).eval(arguments, i, builder, pathMapper);
         }
-      } else if (arg instanceof ActionInput) {
-        builder.add(pathMapper.getMappedExecPathString((ActionInput) arg));
-      } else if (arg instanceof PathFragment) {
-        builder.add(pathMapper.map((PathFragment) arg).getPathString());
+      } else if (arg instanceof ActionInput actionInput) {
+        builder.add(pathMapper.getMappedExecPathString(actionInput));
+      } else if (arg instanceof PathFragment pathFragment) {
+        builder.add(pathMapper.map(pathFragment).getPathString());
       } else {
         builder.add(CommandLineItem.expandToCommandLine(arg));
       }
       // Track the last scalar string argument (e.g. "--javacopts") so that the PathMapper can
       // heuristically map subsequent argument collections that contain paths.
-      if (arg instanceof String) {
-        previousFlag = (String) arg;
+      if (arg instanceof String string) {
+        previousFlag = string;
       } else {
         previousFlag = null;
       }
@@ -1337,8 +1337,8 @@
       String previousFlag) {
     ExceptionlessMapFn<Object> mapFn = pathMapper.getMapFn(previousFlag);
     for (Object value : arg) {
-      if (value instanceof ActionInput) {
-        builder.add(pathMapper.getMappedExecPathString((ActionInput) value));
+      if (value instanceof ActionInput actionInput) {
+        builder.add(pathMapper.getMappedExecPathString(actionInput));
       } else {
         mapFn.expandToCommandLine(value, builder::add);
       }
@@ -1365,8 +1365,8 @@
     int count = arguments.size();
     for (int i = 0; i < count; ) {
       Object arg = arguments.get(i++);
-      if (arg instanceof TreeFileArtifactArgvFragment) {
-        arg = substituteTreeFileArtifactArgvFragment((TreeFileArtifactArgvFragment) arg);
+      if (arg instanceof TreeFileArtifactArgvFragment treeFileArtifactArgvFragment) {
+        arg = substituteTreeFileArtifactArgvFragment(treeFileArtifactArgvFragment);
       }
       if (arg instanceof NestedSet) {
         actionKeyContext.addNestedSetToFingerprint(fingerprint, (NestedSet<Object>) arg);
@@ -1374,8 +1374,8 @@
         for (Object value : (Iterable<Object>) arg) {
           fingerprint.addString(CommandLineItem.expandToCommandLine(value));
         }
-      } else if (arg instanceof ArgvFragment) {
-        i = ((ArgvFragment) arg).addToFingerprint(arguments, i, actionKeyContext, fingerprint);
+      } else if (arg instanceof ArgvFragment argvFragment) {
+        i = argvFragment.addToFingerprint(arguments, i, actionKeyContext, fingerprint);
       } else {
         fingerprint.addString(CommandLineItem.expandToCommandLine(arg));
       }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index a7b08e1..77a1f2c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -254,8 +254,8 @@
     } catch (CommandLineExpansionException e) {
       throw createCommandLineException(e);
     } catch (ExecException e) {
-      if (e instanceof SpawnExecException) {
-        throw ((SpawnExecException) e).toActionExecutionException(this);
+      if (e instanceof SpawnExecException spawnExecException) {
+        throw spawnExecException.toActionExecutionException(this);
       }
       throw ActionExecutionException.fromExecException(e, this);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/StrippingPathMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/StrippingPathMapper.java
index 1c8bfc6..6336171 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/StrippingPathMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/StrippingPathMapper.java
@@ -111,8 +111,8 @@
     final StringStripper argStripper = new StringStripper(outputRoot.getPathString());
     final ExceptionlessMapFn<Object> structuredArgStripper =
         (object, args) -> {
-          if (object instanceof String) {
-            args.accept(argStripper.strip((String) object));
+          if (object instanceof String string) {
+            args.accept(argStripper.strip(string));
           } else {
             args.accept(CommandLineItem.expandToCommandLine(object));
           }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index aab9af5..77c39d9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -573,8 +573,8 @@
 
       if (result instanceof NoneType) {
         return ImmutableMap.of();
-      } else if (result instanceof Dict) {
-        if (((Dict<?, ?>) result).isEmpty()) {
+      } else if (result instanceof Dict<?, ?> dict) {
+        if (dict.isEmpty()) {
           return ImmutableMap.of();
         }
         try {
@@ -609,8 +609,8 @@
           return null;
         }
 
-      } else if (result instanceof Sequence) {
-        if (((Sequence<?>) result).isEmpty()) {
+      } else if (result instanceof Sequence<?> sequence) {
+        if (sequence.isEmpty()) {
           return ImmutableMap.of();
         }
         ImmutableMap.Builder<String, Map<String, Object>> builder = ImmutableMap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
index 33dcda4..6774117 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
@@ -35,8 +35,8 @@
       return NoTransition.createFactory();
     } else if (transition instanceof NullTransition) {
       return NullTransition.createFactory();
-    } else if (transition instanceof SplitTransition) {
-      return split((SplitTransition) transition);
+    } else if (transition instanceof SplitTransition splitTransition) {
+      return split(splitTransition);
     }
     return new AutoValue_TransitionFactories_IdentityFactory<T>(transition);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransition.java
index c6abb56..215b586 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransition.java
@@ -102,8 +102,8 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof ComposingTransition
-        && ((ComposingTransition) other).transition1.equals(this.transition1)
+    return other instanceof ComposingTransition composingTransition
+        && composingTransition.transition1.equals(this.transition1)
         && ((ComposingTransition) other).transition2.equals(this.transition2);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
index 03041a5..4579e40 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/AbstractConfiguredTarget.java
@@ -312,16 +312,16 @@
       Dict.Builder<String, Object> dict, Object key, Object providerInstance) {
     // The key may be of many types, but we need a string for the intended use.
     String keyAsString;
-    if (key instanceof String) {
-      keyAsString = (String) key;
+    if (key instanceof String string) {
+      keyAsString = string;
     } else if (key instanceof Provider.Key) {
       if (key instanceof StarlarkProvider.Key k) {
         keyAsString = k.getExtensionLabel() + "%" + k.getExportedName();
       } else {
         keyAsString = key.toString();
       }
-    } else if (key instanceof Class) {
-      keyAsString = ((Class<?>) key).getSimpleName();
+    } else if (key instanceof Class<?> aClass) {
+      keyAsString = aClass.getSimpleName();
     } else {
       // ???
       return;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
index 20166c5..76b5430 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
@@ -113,13 +113,13 @@
 
   @Override
   protected void addExtraStarlarkKeys(Consumer<String> result) {
-    if (base instanceof AbstractConfiguredTarget) {
-      ((AbstractConfiguredTarget) base).addExtraStarlarkKeys(result);
+    if (base instanceof AbstractConfiguredTarget abstractConfiguredTarget) {
+      abstractConfiguredTarget.addExtraStarlarkKeys(result);
     }
     for (int i = 0; i < nonBaseProviders.getProviderCount(); i++) {
       Object classAt = nonBaseProviders.getProviderKeyAt(i);
-      if (classAt instanceof String) {
-        result.accept((String) classAt);
+      if (classAt instanceof String string) {
+        result.accept(string);
       }
     }
     result.accept(AbstractConfiguredTarget.ACTIONS_FIELD_NAME);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
index d78f147..2db33de 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
@@ -110,8 +110,8 @@
     // Initialize every StarlarkApiProvider
     for (int i = 0; i < providers.getProviderCount(); i++) {
       Object obj = providers.getProviderInstanceAt(i);
-      if (obj instanceof StarlarkApiProvider) {
-        ((StarlarkApiProvider) obj).init(this);
+      if (obj instanceof StarlarkApiProvider starlarkApiProvider) {
+        starlarkApiProvider.init(this);
       }
     }
 
@@ -218,8 +218,8 @@
   protected void addExtraStarlarkKeys(Consumer<String> result) {
     for (int i = 0; i < providers.getProviderCount(); i++) {
       Object classAt = providers.getProviderKeyAt(i);
-      if (classAt instanceof String) {
-        result.accept((String) classAt);
+      if (classAt instanceof String string) {
+        result.accept(string);
       }
     }
     result.accept(ACTIONS_FIELD_NAME);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
index 3d8696e..e30cbbd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java
@@ -132,8 +132,8 @@
    *     matching group is found
    */
   static EnvironmentGroup getEnvironmentGroup(Target envTarget) throws EnvironmentLookupException {
-    if (!(envTarget instanceof Rule)
-        || !((Rule) envTarget).getRuleClass().equals(ConstraintConstants.ENVIRONMENT_RULE)) {
+    if (!(envTarget instanceof Rule rule)
+        || !rule.getRuleClass().equals(ConstraintConstants.ENVIRONMENT_RULE)) {
       throw createEnvironmentLookupException(
           envTarget.getLabel() + " is not a valid environment definition",
           Code.INVALID_ENVIRONMENT);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
index 7e96585..8b2bfa8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
@@ -753,8 +753,8 @@
         // while dep.getLabel() refers to the target the alias points to. So add this quick check
         // to make sure we're comparing the same labels.
         Label depLabelInSelect =
-            (dep instanceof ConfiguredTarget)
-                ? ((ConfiguredTarget) dep).getOriginalLabel()
+            dep instanceof ConfiguredTarget configuredTarget
+                ? configuredTarget.getOriginalLabel()
                 : dep.getLabel();
         // Output files inherit the environment spec of their generating rule.
         if (dep instanceof OutputFileConfiguredTarget) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
index 1e4939d..4d8ea6c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
@@ -436,8 +436,8 @@
     topLevelTarget = topLevelTarget.getActual();
     // Now check the target against expected environments.
     TransitiveInfoCollection asProvider;
-    if (topLevelTarget instanceof OutputFileConfiguredTarget) {
-      asProvider = ((OutputFileConfiguredTarget) topLevelTarget).getGeneratingRule();
+    if (topLevelTarget instanceof OutputFileConfiguredTarget outputFileConfiguredTarget) {
+      asProvider = outputFileConfiguredTarget.getGeneratingRule();
     } else {
       asProvider = topLevelTarget;
     }
@@ -491,8 +491,8 @@
       Collection<MissingEnvironment> missingEnvironments) {
     StringJoiner msg = new StringJoiner("\n");
     ConfiguredTarget targetWithProvider = configuredTarget.getActual();
-    if (targetWithProvider instanceof OutputFileConfiguredTarget) {
-      targetWithProvider = ((OutputFileConfiguredTarget) targetWithProvider).getGeneratingRule();
+    if (targetWithProvider instanceof OutputFileConfiguredTarget outputFileConfiguredTarget) {
+      targetWithProvider = outputFileConfiguredTarget.getGeneratingRule();
     }
     SupportedEnvironmentsProvider supportedEnvironments =
         targetWithProvider.getProvider(SupportedEnvironmentsProvider.class);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
index 77c9936..10fa563 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java
@@ -91,8 +91,8 @@
       sink.acceptPlatformMappingError(exception);
       return;
     }
-    if (value instanceof PlatformMappingValue) {
-      this.platformMappingValue = (PlatformMappingValue) value;
+    if (value instanceof PlatformMappingValue platformMappingValue) {
+      this.platformMappingValue = platformMappingValue;
       return;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/ConfiguredTargetAndDataProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/ConfiguredTargetAndDataProducer.java
index 9843f14..840e662 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/ConfiguredTargetAndDataProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/ConfiguredTargetAndDataProducer.java
@@ -188,12 +188,12 @@
 
   @Override
   public void accept(SkyValue value) {
-    if (value instanceof BuildConfigurationValue) {
-      this.configurationValue = (BuildConfigurationValue) value;
+    if (value instanceof BuildConfigurationValue buildConfigurationValue) {
+      this.configurationValue = buildConfigurationValue;
       return;
     }
-    if (value instanceof PackageValue) {
-      this.pkg = ((PackageValue) value).getPackage();
+    if (value instanceof PackageValue packageValue) {
+      this.pkg = packageValue.getPackage();
       return;
     }
     throw new IllegalArgumentException("unexpected value: " + value);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformFlagsProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformFlagsProducer.java
index 0ba66c0..664fa58 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformFlagsProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/PlatformFlagsProducer.java
@@ -107,8 +107,8 @@
 
   private void acceptParsedFlagsValue(
       @Nullable SkyValue value, @Nullable OptionsParsingException exception) {
-    if (value != null && value instanceof ParsedFlagsValue) {
-      this.parsedFlags = ((ParsedFlagsValue) value).flags();
+    if (value != null && value instanceof ParsedFlagsValue parsedFlagsValue) {
+      this.parsedFlags = parsedFlagsValue.flags();
       return;
     }
     if (exception != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
index 23cd0f0..c63f650 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java
@@ -477,8 +477,8 @@
         // Convert NoneType to null.
         if (optionValue instanceof NoneType) {
           optionValue = null;
-        } else if (optionValue instanceof StarlarkInt) {
-          optionValue = ((StarlarkInt) optionValue).toIntUnchecked();
+        } else if (optionValue instanceof StarlarkInt starlarkInt) {
+          optionValue = starlarkInt.toIntUnchecked();
         } else if (optionValue instanceof List<?>) {
           // Converting back to the Java-native type makes it easier to check if a Starlark
           // transition set the same value a native transition would. This is important for
@@ -516,8 +516,8 @@
                           optionValueAsList.stream()
                               .map(
                                   element ->
-                                      element instanceof Label
-                                          ? ((Label) element).getUnambiguousCanonicalForm()
+                                      element instanceof Label label
+                                          ? label.getUnambiguousCanonicalForm()
                                           : element.toString())
                               .collect(joining(",")),
                           starlarkTransition.getPackageContext());
@@ -529,8 +529,8 @@
                 Object converted =
                     def.getConverter()
                         .convert(e.toString(), starlarkTransition.getPackageContext());
-                if (converted instanceof List) {
-                  valueBuilder.addAll((List<?>) converted);
+                if (converted instanceof List<?> list) {
+                  valueBuilder.addAll(list);
                 } else {
                   valueBuilder.add(converted);
                 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
index 86c3d7c..3868fb0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkActionFactory.java
@@ -698,8 +698,8 @@
     builder.addOutputs(outputArtifacts);
 
     if (unusedInputsList != Starlark.NONE) {
-      if (unusedInputsList instanceof Artifact) {
-        builder.setUnusedInputsList(Optional.of((Artifact) unusedInputsList));
+      if (unusedInputsList instanceof Artifact artifact) {
+        builder.setUnusedInputsList(Optional.of(artifact));
       } else {
         throw Starlark.errorf(
             "expected value of type 'File' for a member of parameter 'unused_inputs_list' but got"
@@ -790,8 +790,8 @@
     builder.setExecutionInfo(executionInfo);
 
     Label toolchainLabel = null;
-    if (toolchainUnchecked instanceof Label) {
-      toolchainLabel = (Label) toolchainUnchecked;
+    if (toolchainUnchecked instanceof Label label) {
+      toolchainLabel = label;
     } else if (toolchainUnchecked instanceof String) {
       try {
         toolchainLabel =
@@ -916,12 +916,12 @@
       }
 
       Object value = resourceSetMap.get(key);
-      if (value instanceof StarlarkInt) {
-        return ((StarlarkInt) value).toDouble();
+      if (value instanceof StarlarkInt starlarkInt) {
+        return starlarkInt.toDouble();
       }
 
-      if (value instanceof StarlarkFloat) {
-        return ((StarlarkFloat) value).toDouble();
+      if (value instanceof StarlarkFloat starlarkFloat) {
+        return starlarkFloat.toDouble();
       }
       throw new EvalException(
           String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
index 1f3e813..b902146 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkAttrModule.java
@@ -297,8 +297,8 @@
         builder.cfg(ExecutionTransitionFactory.createFactory());
       } else if (trans.equals("exec")) {
         builder.cfg(ExecutionTransitionFactory.createFactory());
-      } else if (trans instanceof ExecutionTransitionFactory) {
-        builder.cfg((ExecutionTransitionFactory) trans);
+      } else if (trans instanceof ExecutionTransitionFactory executionTransitionFactory) {
+        builder.cfg(executionTransitionFactory);
       } else if (trans instanceof SplitTransition) {
         // TODO(jcater): remove TransitionFactories usage.
         builder.cfg(TransitionFactories.of((SplitTransition) trans));
@@ -377,8 +377,8 @@
     ImmutableList.Builder<StarlarkProviderIdentifier> result = ImmutableList.builder();
 
     for (Object obj : list) {
-      if (obj instanceof String) {
-        result.add(StarlarkProviderIdentifier.forLegacy((String) obj));
+      if (obj instanceof String string) {
+        result.add(StarlarkProviderIdentifier.forLegacy(string));
       } else if (obj instanceof Provider constructor) {
         if (!constructor.isExported()) {
           throw Starlark.errorf(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
index 0f62e64..2d4d5ed 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkCustomCommandLine.java
@@ -888,8 +888,8 @@
     // It'd be nice to build this into DerivedArtifact's CommandLine interface so we don't have
     // to explicitly check if an object is a DerivedArtifact. Unfortunately that would require
     // a lot more dependencies on the Java library DerivedArtifact is built into.
-    return object instanceof DerivedArtifact
-        ? pathMapper.map(((DerivedArtifact) object).getExecPath()).getPathString()
+    return object instanceof DerivedArtifact derivedArtifact
+        ? pathMapper.map(derivedArtifact.getExecPath()).getPathString()
         : CommandLineItem.expandToCommandLine(object);
   }
 
@@ -1037,8 +1037,8 @@
       int count = originalValues.size();
       // map_each can accept either each object, or each object + a directory expander.
       boolean wantsDirectoryExpander =
-          (mapFn instanceof StarlarkFunction)
-              && ((StarlarkFunction) mapFn).getParameterNames().size() >= 2;
+          mapFn instanceof StarlarkFunction starlarkFunction
+              && starlarkFunction.getParameterNames().size() >= 2;
       // We create a list that we reuse for the args to map_each
       List<Object> args = new ArrayList<>(2);
       args.add(null); // This will be overwritten each iteration.
@@ -1054,10 +1054,10 @@
       for (int i = 0; i < count; ++i) {
         args.set(0, originalValues.get(i));
         Object ret = Starlark.call(thread, mapFn, args, /*kwargs=*/ ImmutableMap.of());
-        if (ret instanceof String) {
-          consumer.accept((String) ret);
-        } else if (ret instanceof Sequence) {
-          for (Object val : ((Sequence<?>) ret)) {
+        if (ret instanceof String string) {
+          consumer.accept(string);
+        } else if (ret instanceof Sequence<?> sequence) {
+          for (Object val : sequence) {
             if (!(val instanceof String)) {
               throw new CommandLineExpansionException(
                   "Expected map_each to return string, None, or list of strings, "
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
index 6141a08..f89f2b4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
@@ -328,8 +328,8 @@
           }
         }
       } else {
-        if (info instanceof StarlarkInfo) {
-          info = ((StarlarkInfo) info).unsafeOptimizeMemoryLayout();
+        if (info instanceof StarlarkInfo starlarkInfo) {
+          info = starlarkInfo.unsafeOptimizeMemoryLayout();
         }
         Provider.Key providerKey = getProviderKey(info);
         // Single declared provider
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
index 1047a563..e6ece09 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleContext.java
@@ -293,8 +293,8 @@
               this, ((AspectContext) ruleContext).getMainAspectPrerequisitesCollection());
       for (Attribute attribute : attributes) {
         Object defaultValue = attribute.getDefaultValue(null);
-        if (defaultValue instanceof ComputedDefault) {
-          defaultValue = ((ComputedDefault) defaultValue).getDefault(ruleContext.attributes());
+        if (defaultValue instanceof ComputedDefault computedDefault) {
+          defaultValue = computedDefault.getDefault(ruleContext.attributes());
         }
         aspectBuilder.addAttribute(attribute, defaultValue);
       }
@@ -315,8 +315,8 @@
         }
         for (Attribute attribute : aspect.getDefinition().getAttributes().values()) {
           Object defaultValue = attribute.getDefaultValue(null);
-          if (defaultValue instanceof ComputedDefault) {
-            defaultValue = ((ComputedDefault) defaultValue).getDefault(ruleContext.attributes());
+          if (defaultValue instanceof ComputedDefault computedDefault) {
+            defaultValue = computedDefault.getDefault(ruleContext.attributes());
           }
           ruleBuilder.addAttribute(attribute, defaultValue);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
index 763f11c..6463a73 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkToolchainContext.java
@@ -86,10 +86,10 @@
   }
 
   private Label transformKey(StarlarkThread starlarkThread, Object key) throws EvalException {
-    if (key instanceof Label) {
-      return (Label) key;
-    } else if (key instanceof ToolchainTypeInfo) {
-      return ((ToolchainTypeInfo) key).typeLabel();
+    if (key instanceof Label label) {
+      return label;
+    } else if (key instanceof ToolchainTypeInfo toolchainTypeInfo) {
+      return toolchainTypeInfo.typeLabel();
     } else if (key instanceof String) {
       try {
         LabelConverter converter = LabelConverter.forBzlEvaluatingThread(starlarkThread);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
index d8f64f9..0584a4c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkTransition.java
@@ -417,8 +417,8 @@
       extends ConfigurationTransition.Visitor<TransitionException> {
     @Override
     default void accept(ConfigurationTransition transition) throws TransitionException {
-      if (transition instanceof StarlarkTransition) {
-        this.accept((StarlarkTransition) transition);
+      if (transition instanceof StarlarkTransition starlarkTransition) {
+        this.accept(starlarkTransition);
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/TemplateDict.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/TemplateDict.java
index b717829..b2bef45 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/TemplateDict.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/TemplateDict.java
@@ -140,10 +140,10 @@
                     mapEach,
                     /*args=*/ ImmutableList.of(val),
                     /*kwargs=*/ ImmutableMap.of());
-            if (ret instanceof String) {
-              parts.add((String) ret);
-            } else if (ret instanceof Sequence) {
-              for (Object v : ((Sequence) ret)) {
+            if (ret instanceof String string) {
+              parts.add(string);
+            } else if (ret instanceof Sequence<?> sequence) {
+              for (Object v : sequence) {
                 if (!(v instanceof String)) {
                   throw Starlark.errorf(
                       "Function provided to map_each must return string, None, or list of strings,"
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
index ce7e897..36b0dc8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
@@ -77,8 +77,8 @@
         if (supportFilesElement instanceof Depset) {
           supportFilesBuilder.addTransitive(
               Depset.cast(supportFilesElement, Artifact.class, "coverage_support_files"));
-        } else if (supportFilesElement instanceof Artifact) {
-          supportFilesBuilder.add((Artifact) supportFilesElement);
+        } else if (supportFilesElement instanceof Artifact artifact) {
+          supportFilesBuilder.add(artifact);
         } else {
           throw Starlark.errorf(
               "at index %d of coverage_support_files, got element of type %s, want one of depset,"
diff --git a/src/main/java/com/google/devtools/build/lib/authandtls/NetrcParser.java b/src/main/java/com/google/devtools/build/lib/authandtls/NetrcParser.java
index 10be801..1ad0c8c 100644
--- a/src/main/java/com/google/devtools/build/lib/authandtls/NetrcParser.java
+++ b/src/main/java/com/google/devtools/build/lib/authandtls/NetrcParser.java
@@ -137,8 +137,8 @@
     boolean done = false;
     while (!done && tokenStream.hasNext()) {
       Token token = tokenStream.next();
-      if (token instanceof ItemToken) {
-        String item = ((ItemToken) token).item();
+      if (token instanceof ItemToken itemToken) {
+        String item = itemToken.item();
         switch (item) {
           case MACHINE:
             String machine = nextItem(tokenStream);
@@ -168,8 +168,8 @@
   private static String nextItem(TokenStream tokenStream) throws IOException {
     while (tokenStream.hasNext()) {
       Token token = tokenStream.next();
-      if (token instanceof ItemToken) {
-        return ((ItemToken) token).item();
+      if (token instanceof ItemToken itemToken) {
+        return itemToken.item();
       }
     }
 
@@ -185,8 +185,8 @@
     while (!done && tokenStream.hasNext()) {
       // Peek rather than taking next token since we probably won't process it
       Token token = tokenStream.peek();
-      if (token instanceof ItemToken) {
-        String item = ((ItemToken) token).item();
+      if (token instanceof ItemToken itemToken) {
+        String item = itemToken.item();
         switch (item) {
           case LOGIN:
             tokenStream.next();
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java
index 85fdd2a..ed035a2 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java
@@ -72,8 +72,8 @@
   private JsonElement serializeObject(Object obj) {
     if (obj.equals(Starlark.NONE)) {
       return JsonNull.INSTANCE;
-    } else if (obj instanceof Boolean) {
-      return new JsonPrimitive((Boolean) obj);
+    } else if (obj instanceof Boolean bool) {
+      return new JsonPrimitive(bool);
     } else if (obj instanceof StarlarkInt) {
       try {
         return new JsonPrimitive(((StarlarkInt) obj).toInt("serialization into the lockfile"));
@@ -145,8 +145,8 @@
    * @return serialized object
    */
   private String serializeObjToString(Object obj) {
-    if (obj instanceof Label) {
-      String labelString = ((Label) obj).getUnambiguousCanonicalForm();
+    if (obj instanceof Label label) {
+      String labelString = label.getUnambiguousCanonicalForm();
       Preconditions.checkState(labelString.startsWith("@@"));
       return labelString;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java
index e075b96..dab0397 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/InterimModule.java
@@ -264,8 +264,8 @@
       @Nullable ModuleOverride override = overrides.get(depSpec.getName());
       if (override instanceof NonRegistryOverride) {
         newVersion = Version.EMPTY;
-      } else if (override instanceof SingleVersionOverride) {
-        Version overrideVersion = ((SingleVersionOverride) override).getVersion();
+      } else if (override instanceof SingleVersionOverride singleVersionOverride) {
+        Version overrideVersion = singleVersionOverride.getVersion();
         if (!overrideVersion.isEmpty()) {
           newVersion = overrideVersion;
         }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
index 6054406..2d25525 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileFunction.java
@@ -576,8 +576,8 @@
     // TODO(wyv): Move registry object creation to BazelRepositoryModule so we don't repeatedly
     //   create them, and we can better report the error (is it a flag error or override error?).
     List<String> registries = Objects.requireNonNull(REGISTRIES.get(env));
-    if (override instanceof RegistryOverride) {
-      String overrideRegistry = ((RegistryOverride) override).getRegistry();
+    if (override instanceof RegistryOverride registryOverride) {
+      String overrideRegistry = registryOverride.getRegistry();
       if (!overrideRegistry.isEmpty()) {
         registries = ImmutableList.of(overrideRegistry);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
index ae0eae0..1ee8e2d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleFileGlobals.java
@@ -950,8 +950,8 @@
     context.setNonModuleCalled();
     validateModuleName(moduleName);
     ImmutableList<String> urlList =
-        urls instanceof String
-            ? ImmutableList.of((String) urls)
+        urls instanceof String string
+            ? ImmutableList.of(string)
             : Sequence.cast(urls, String.class, "urls").getImmutableList();
     context.addOverride(
         moduleName,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
index 8358c08..5550521 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java
@@ -896,8 +896,8 @@
                     Starlark.type(returnValue)),
                 Transience.PERSISTENT);
           }
-          if (returnValue instanceof ModuleExtensionMetadata) {
-            moduleExtensionMetadata = Optional.of((ModuleExtensionMetadata) returnValue);
+          if (returnValue instanceof ModuleExtensionMetadata retMetadata) {
+            moduleExtensionMetadata = Optional.of(retMetadata);
           } else {
             moduleExtensionMetadata = Optional.empty();
           }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/ModCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/ModCommand.java
index 2dd0708..5ff673c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/ModCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/ModCommand.java
@@ -594,9 +594,8 @@
       buildozerCommand.build().execute();
     } catch (InterruptedException | CommandException e) {
       String suffix = "";
-      if (e instanceof AbnormalTerminationException) {
-        if (((AbnormalTerminationException) e).getResult().getTerminationStatus().getRawExitCode()
-            == 3) {
+      if (e instanceof AbnormalTerminationException abnormalTerminationException) {
+        if (abnormalTerminationException.getResult().getTerminationStatus().getRawExitCode() == 3) {
           // Buildozer exits with exit code 3 if it didn't make any changes.
           return BlazeCommandResult.success();
         }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
index 134f1a0..47c169c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/DecompressorValue.java
@@ -86,8 +86,9 @@
 
   @Override
   public boolean equals(Object other) {
-    return this == other || (other instanceof DecompressorValue
-        && directory.equals(((DecompressorValue) other).directory));
+    return this == other
+        || other instanceof DecompressorValue decompressorValue
+            && directory.equals(decompressorValue.directory);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
index 8c79a47..84b9ec7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryResolvedModule.java
@@ -117,8 +117,8 @@
       // In WORKSPACE files, the Label constructor is not available.
       // Fortunately, in all places where a label is needed,
       // we can pass the canonical string associated with this label.
-      if (o instanceof Label) {
-        return this.repr(((Label) o).getCanonicalForm());
+      if (o instanceof Label label) {
+        return this.repr(label.getCanonicalForm());
       }
       return super.repr(o);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
index c0923ad..5bed266 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
@@ -353,8 +353,8 @@
       Object urlOrList, boolean ensureNonEmpty, boolean checksumGiven)
       throws RepositoryFunctionException, EvalException {
     ImmutableList<String> urlStrings;
-    if (urlOrList instanceof String) {
-      urlStrings = ImmutableList.of((String) urlOrList);
+    if (urlOrList instanceof String string) {
+      urlStrings = ImmutableList.of(string);
     } else {
       urlStrings = checkAllUrls((Iterable<?>) urlOrList);
     }
@@ -1148,10 +1148,10 @@
       throws EvalException, InterruptedException {
     if (path instanceof String) {
       return new StarlarkPath(this, workingDirectory.getRelative(path.toString()));
-    } else if (path instanceof Label) {
-      return getPathFromLabel((Label) path);
-    } else if (path instanceof StarlarkPath) {
-      return (StarlarkPath) path;
+    } else if (path instanceof Label label) {
+      return getPathFromLabel(label);
+    } else if (path instanceof StarlarkPath starlarkPath) {
+      return starlarkPath;
     } else {
       // This can never happen because we check it in the Starlark interpreter.
       throw new IllegalArgumentException("expected string or label for path");
@@ -1583,8 +1583,8 @@
 
     List<String> args = new ArrayList<>(arguments.size());
     for (Object arg : arguments) {
-      if (arg instanceof Label) {
-        args.add(getPathFromLabel((Label) arg).toString());
+      if (arg instanceof Label label) {
+        args.add(getPathFromLabel(label).toString());
       } else {
         // String or StarlarkPath expected
         args.add(arg.toString());
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
index ad28d31..9793202 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
@@ -630,24 +630,24 @@
     boolean needsRestart = false;
     for (String name : attr.getFieldNames()) {
       Object value = attr.getValue(name);
-      if (value instanceof Label) {
-        if (dependOnLabelIgnoringErrors((Label) value)) {
+      if (value instanceof Label label) {
+        if (dependOnLabelIgnoringErrors(label)) {
           needsRestart = true;
         }
       }
-      if (value instanceof Sequence) {
-        for (Object entry : (Sequence) value) {
-          if (entry instanceof Label) {
-            if (dependOnLabelIgnoringErrors((Label) entry)) {
+      if (value instanceof Sequence<?> sequence) {
+        for (Object entry : sequence) {
+          if (entry instanceof Label label2) {
+            if (dependOnLabelIgnoringErrors(label2)) {
               needsRestart = true;
             }
           }
         }
       }
-      if (value instanceof Dict) {
-        for (Object entry : ((Dict) value).keySet()) {
-          if (entry instanceof Label) {
-            if (dependOnLabelIgnoringErrors((Label) entry)) {
+      if (value instanceof Dict<?, ?> dict) {
+        for (Object entry : dict.keySet()) {
+          if (entry instanceof Label label2) {
+            if (dependOnLabelIgnoringErrors(label2)) {
               needsRestart = true;
             }
           }
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceUploader.java b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceUploader.java
index 733a90a..2242fc2 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceUploader.java
+++ b/src/main/java/com/google/devtools/build/lib/buildeventservice/BuildEventServiceUploader.java
@@ -199,8 +199,8 @@
         return;
       }
       // BuildCompletingEvent marks the end of the build in the BEP event stream.
-      if (event instanceof BuildCompletingEvent) {
-        ExitCode exitCode = ((BuildCompletingEvent) event).getExitCode();
+      if (event instanceof BuildCompletingEvent buildCompletingEvent) {
+        ExitCode exitCode = buildCompletingEvent.getExitCode();
         if (exitCode != null && exitCode.getNumericExitCode() == 0) {
           buildStatus = COMMAND_SUCCEEDED;
         } else {
@@ -599,13 +599,13 @@
         // of events that haven't been uploaded.
         EventLoopCommand event;
         while ((event = ackQueue.pollFirst()) != null) {
-          if (event instanceof SendRegularBuildEventCommand) {
-            cancelLocalFileUpload((SendRegularBuildEventCommand) event);
+          if (event instanceof SendRegularBuildEventCommand sendRegularBuildEventCommand) {
+            cancelLocalFileUpload(sendRegularBuildEventCommand);
           }
         }
         while ((event = eventQueue.pollFirst()) != null) {
-          if (event instanceof SendRegularBuildEventCommand) {
-            cancelLocalFileUpload((SendRegularBuildEventCommand) event);
+          if (event instanceof SendRegularBuildEventCommand sendRegularBuildEventCommand) {
+            cancelLocalFileUpload(sendRegularBuildEventCommand);
           }
         }
       }
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java b/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java
index 9bd7dd4..2fa9e1c 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/BazelModuleContext.java
@@ -113,8 +113,8 @@
   @Nullable
   public static BazelModuleContext of(Module m) {
     @Nullable Object data = m.getClientData();
-    if (data instanceof BazelModuleContext) {
-      return (BazelModuleContext) data;
+    if (data instanceof BazelModuleContext bazelModuleContext) {
+      return bazelModuleContext;
     } else {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/ArtifactNestedSetKey.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/ArtifactNestedSetKey.java
index 3255764..4bc2c27 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/ArtifactNestedSetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/ArtifactNestedSetKey.java
@@ -70,8 +70,8 @@
   public ImmutableList<SkyKey> getDirectDepKeys() {
     ImmutableList.Builder<SkyKey> depKeys = ImmutableList.builderWithExpectedSize(children.length);
     for (Object child : children) {
-      if (child instanceof Artifact) {
-        depKeys.add(Artifact.key((Artifact) child));
+      if (child instanceof Artifact artifact) {
+        depKeys.add(Artifact.key(artifact));
       } else {
         depKeys.add(createInternal((Object[]) child));
       }
@@ -82,8 +82,8 @@
   /** Applies a consumer function to the direct artifacts of this nested set. */
   public void applyToDirectArtifacts(DirectArtifactConsumer function) throws InterruptedException {
     for (Object child : children) {
-      if (child instanceof Artifact) {
-        function.accept((Artifact) child);
+      if (child instanceof Artifact artifact) {
+        function.accept(artifact);
       }
     }
   }
@@ -173,8 +173,8 @@
     if (this == that) {
       return true;
     }
-    return that instanceof ArtifactNestedSetKey
-        && children == ((ArtifactNestedSetKey) that).children;
+    return that instanceof ArtifactNestedSetKey artifactNestedSetKey
+        && children == artifactNestedSetKey.children;
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java
index 5233680..eeced23 100644
--- a/src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/dynamic/DynamicSpawnStrategy.java
@@ -547,8 +547,8 @@
       return null;
     } catch (ExecutionException e) {
       Throwable cause = e.getCause();
-      if (cause instanceof ExecException) {
-        throw (ExecException) cause;
+      if (cause instanceof ExecException execException) {
+        throw execException;
       } else if (cause instanceof InterruptedException) {
         // If the branch was interrupted, it might be due to a user interrupt or due to our request
         // for cancellation. Assume the latter here because if this was actually a user interrupt,
diff --git a/src/main/java/com/google/devtools/build/lib/exec/ExpandedSpawnLogContext.java b/src/main/java/com/google/devtools/build/lib/exec/ExpandedSpawnLogContext.java
index 53c538c..0dc9b04 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/ExpandedSpawnLogContext.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/ExpandedSpawnLogContext.java
@@ -169,8 +169,8 @@
 
           boolean isTool =
               toolFiles.contains(input)
-                  || (input instanceof TreeFileArtifact
-                      && toolFiles.contains(((TreeFileArtifact) input).getParent()));
+                  || input instanceof TreeFileArtifact treeFileArtifact
+                      && toolFiles.contains(treeFileArtifact.getParent());
 
           Path contentPath = fileSystem.getPath(execRoot.getRelative(input.getExecPathString()));
 
diff --git a/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java b/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java
index 413f0bc..985f455 100644
--- a/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java
+++ b/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java
@@ -155,8 +155,8 @@
     }
 
     if (input != null) {
-      if (input instanceof VirtualActionInput) {
-        byte[] blob = ((VirtualActionInput) input).getBytes().toByteArray();
+      if (input instanceof VirtualActionInput virtualActionInput) {
+        byte[] blob = virtualActionInput.getBytes().toByteArray();
         return builder
             .setHash(digestHashFunction.getHashFunction().hashBytes(blob).toString())
             .setSizeBytes(blob.length)
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java
index 58f10d8..fb59fd9 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java
@@ -133,8 +133,7 @@
   @VisibleForTesting
   public static Predicate<Target> testTimeoutFilter(final Set<TestTimeout> allowedTimeouts) {
     return target ->
-        target instanceof Rule
-            && allowedTimeouts.contains(TestTimeout.getTestTimeout((Rule) target));
+        target instanceof Rule rule && allowedTimeouts.contains(TestTimeout.getTestTimeout(rule));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
index 88906d5..400403f 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -1149,8 +1149,8 @@
   }
 
   protected static FailureDetail createUnsuccessfulKeyFailure(Exception exception) {
-    return exception instanceof DetailedException
-        ? ((DetailedException) exception).getDetailedExitCode().getFailureDetail()
+    return exception instanceof DetailedException detailedException
+        ? detailedException.getDetailedExitCode().getFailureDetail()
         : FailureDetail.newBuilder()
             .setMessage(exception.getMessage())
             .setQuery(Query.newBuilder().setCode(Code.SKYQUERY_TARGET_EXCEPTION))
diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
index 72e183c..ef438c6 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphQueryEnvironment.java
@@ -263,8 +263,8 @@
   protected RuleConfiguredTarget getRuleConfiguredTarget(
       ConfiguredTargetValue configuredTargetValue) {
     ConfiguredTarget configuredTarget = configuredTargetValue.getConfiguredTarget();
-    if (configuredTarget instanceof RuleConfiguredTarget) {
-      return (RuleConfiguredTarget) configuredTarget;
+    if (configuredTarget instanceof RuleConfiguredTarget ruleConfiguredTarget) {
+      return ruleConfiguredTarget;
     }
     return null;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
index 8a4f21d..24182af 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/ConfiguredTargetQueryEnvironment.java
@@ -323,10 +323,10 @@
     SkyValue value = getConfiguredTargetValue(key);
     if (value == null) {
       return null;
-    } else if (value instanceof ConfiguredTargetValue) {
-      return ((ConfiguredTargetValue) value).getConfiguredTarget();
-    } else if (value instanceof AspectValue && key instanceof AspectKey) {
-      return (AspectKey) key;
+    } else if (value instanceof ConfiguredTargetValue configuredTargetValue) {
+      return configuredTargetValue.getConfiguredTarget();
+    } else if (value instanceof AspectValue && key instanceof AspectKey aspectValue) {
+      return aspectValue;
     } else {
       throw new IllegalStateException("unknown value type for CqueryNode");
     }
@@ -490,8 +490,8 @@
   @Nullable
   @Override
   protected RuleConfiguredTarget getRuleConfiguredTarget(CqueryNode configuredTarget) {
-    if (configuredTarget instanceof RuleConfiguredTarget) {
-      return (RuleConfiguredTarget) configuredTarget;
+    if (configuredTarget instanceof RuleConfiguredTarget ruleConfiguredTarget) {
+      return ruleConfiguredTarget;
     }
     return null;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpression.java b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpression.java
index 0f88b01..96e8c9e 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/engine/QueryExpression.java
@@ -109,7 +109,7 @@
 
   /** Checks if this QueryExpression has a SomePathFunction at its top level. */
   public boolean isTopLevelSomePathFunction() {
-    return this instanceof FunctionExpression
-        && "somepath".equals(((FunctionExpression) this).getFunction().getName());
+    return this instanceof FunctionExpression functionExpression
+        && "somepath".equals(functionExpression.getFunction().getName());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/LabelVisitor.java b/src/main/java/com/google/devtools/build/lib/query2/query/LabelVisitor.java
index 7d59727..0d4917f 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/LabelVisitor.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/LabelVisitor.java
@@ -398,8 +398,8 @@
       observeNode(target);
 
       // LabelVisitor has some legacy special handling of OutputFiles.
-      if (target instanceof OutputFile) {
-        Rule rule = ((OutputFile) target).getGeneratingRule();
+      if (target instanceof OutputFile outputFile) {
+        Rule rule = outputFile.getGeneratingRule();
         observeEdge(target, null, rule);
         visit(null, null, rule, depth + 1, count + 1);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
index 623a85f..c40f384 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/BuildOutputFormatter.java
@@ -190,8 +190,8 @@
           licenseTypes.add(Ascii.toLowerCase(licenseType.toString()));
         }
         value = licenseTypes;
-      } else if (value instanceof TriState) {
-        value = ((TriState) value).toInt();
+      } else if (value instanceof TriState triState) {
+        value = triState.toInt();
       }
       return new Printer() {
         // Print labels in their canonical form.
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/ConditionalEdges.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/ConditionalEdges.java
index 3bde3d9..daf9b0f 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/ConditionalEdges.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/ConditionalEdges.java
@@ -135,12 +135,12 @@
             (key, value) -> {
               if (value instanceof List<?> deps) {
                 for (Object dep : deps) {
-                  if (dep instanceof Label) {
-                    conditions.put((Label) dep, key);
+                  if (dep instanceof Label label) {
+                    conditions.put(label, key);
                   }
                 }
-              } else if (value instanceof Label) {
-                conditions.put((Label) value, key);
+              } else if (value instanceof Label label) {
+                conditions.put(label, key);
               }
             });
       }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/XmlOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/XmlOutputFormatter.java
index 8427830..e96e5b7 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/XmlOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/XmlOutputFormatter.java
@@ -350,8 +350,8 @@
         // Values such as those of attribute "linkstamp" may be null.
         if (value != null) {
           try {
-            if (value instanceof Label) {
-              elem.setAttribute("value", labelPrinter.toString((Label) value));
+            if (value instanceof Label label) {
+              elem.setAttribute("value", labelPrinter.toString(label));
             } else {
               elem.setAttribute("value", value.toString());
             }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/AbstractActionInputPrefetcher.java b/src/main/java/com/google/devtools/build/lib/remote/AbstractActionInputPrefetcher.java
index 1b8866c..8378624 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/AbstractActionInputPrefetcher.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/AbstractActionInputPrefetcher.java
@@ -331,8 +331,8 @@
       ActionInput input,
       Priority priority) {
     try {
-      if (input instanceof VirtualActionInput) {
-        prefetchVirtualActionInput((VirtualActionInput) input);
+      if (input instanceof VirtualActionInput virtualActionInput) {
+        prefetchVirtualActionInput(virtualActionInput);
         return immediateVoidFuture();
       }
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/Chunker.java b/src/main/java/com/google/devtools/build/lib/remote/Chunker.java
index 295656b..12c43bb 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/Chunker.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/Chunker.java
@@ -325,8 +325,8 @@
     public Builder setInput(long size, ActionInput actionInput, Path execRoot) {
       checkState(inputStream == null);
       this.size = size;
-      if (actionInput instanceof VirtualActionInput) {
-        inputStream = () -> ((VirtualActionInput) actionInput).getBytes().newInput();
+      if (actionInput instanceof VirtualActionInput virtualActionInput) {
+        inputStream = () -> virtualActionInput.getBytes().newInput();
       } else {
         inputStream = () -> ActionInputHelper.toInputPath(actionInput, execRoot).getInputStream();
       }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/GoogleChannelConnectionFactory.java b/src/main/java/com/google/devtools/build/lib/remote/GoogleChannelConnectionFactory.java
index b20252f..6481c5b 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/GoogleChannelConnectionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/GoogleChannelConnectionFactory.java
@@ -159,8 +159,8 @@
               reporter.handle(Event.error(message));
 
               IOException exception;
-              if (error instanceof IOException) {
-                exception = (IOException) error;
+              if (error instanceof IOException ioException) {
+                exception = ioException;
               } else {
                 exception = new IOException(error);
               }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/LeaseService.java b/src/main/java/com/google/devtools/build/lib/remote/LeaseService.java
index 2058fa1..2bc6218 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/LeaseService.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/LeaseService.java
@@ -88,8 +88,8 @@
           if (key.functionName().equals(SkyFunctions.ACTION_EXECUTION)) {
             try {
               var value = memoizingEvaluator.getExistingValue(key);
-              return value instanceof ActionExecutionValue
-                  && isRemote((ActionExecutionValue) value);
+              return value instanceof ActionExecutionValue actionExecutionValue
+                  && isRemote(actionExecutionValue);
             } catch (InterruptedException ignored) {
               return false;
             }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java
index c8f44b4..55cad40 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteActionFileSystem.java
@@ -291,8 +291,8 @@
   private boolean isRemote(PathFragment path) throws IOException {
     // Files in the local filesystem are non-remote by definition, so stat only in-memory sources.
     var status = statInternal(path, FollowMode.FOLLOW_ALL, StatSources.IN_MEMORY_ONLY);
-    return (status instanceof FileStatusWithMetadata)
-        && ((FileStatusWithMetadata) status).getMetadata().isRemote();
+    return status instanceof FileStatusWithMetadata fileStatusWithMetadata
+        && fileStatusWithMetadata.getMetadata().isRemote();
   }
 
   public void updateContext(ActionExecutionMetadata action) {
@@ -427,8 +427,8 @@
     // The parent path has already been canonicalized by resolveSymbolicLinks, so FOLLOW_NONE is
     // effectively the same as FOLLOW_PARENT, but more efficient.
     var status = statInternal(path, FollowMode.FOLLOW_NONE, StatSources.IN_MEMORY_ONLY);
-    if (status instanceof FileStatusWithDigest) {
-      return ((FileStatusWithDigest) status).getDigest();
+    if (status instanceof FileStatusWithDigest fileStatusWithDigest) {
+      return fileStatusWithDigest.getDigest();
     }
     return localFs.getPath(path).getFastDigest();
   }
@@ -440,8 +440,8 @@
     // The parent path has already been canonicalized by resolveSymbolicLinks, so FOLLOW_NONE is
     // effectively the same as FOLLOW_PARENT, but more efficient.
     var status = statInternal(path, FollowMode.FOLLOW_NONE, StatSources.IN_MEMORY_ONLY);
-    if (status instanceof FileStatusWithDigest) {
-      return ((FileStatusWithDigest) status).getDigest();
+    if (status instanceof FileStatusWithDigest fileStatusWithDigest) {
+      return fileStatusWithDigest.getDigest();
     }
     return localFs.getPath(path).getDigest();
   }
@@ -526,8 +526,8 @@
     if (path.startsWith(execRoot)) {
       var execPath = path.relativeTo(execRoot);
       var metadata = inputArtifactData.getMetadata(execPath);
-      if (metadata instanceof UnresolvedSymlinkArtifactValue) {
-        return PathFragment.create(((UnresolvedSymlinkArtifactValue) metadata).getSymlinkTarget());
+      if (metadata instanceof UnresolvedSymlinkArtifactValue unresolvedSymlinkArtifactValue) {
+        return PathFragment.create(unresolvedSymlinkArtifactValue.getSymlinkTarget());
       }
       if (metadata != null) {
         // Other input artifacts are never symlinks.
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
index 4fb54a1..51b95e0 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteCache.java
@@ -273,8 +273,8 @@
 
           @Override
           public void onFailure(Throwable t) {
-            if (t instanceof CacheNotFoundException) {
-              ((CacheNotFoundException) t).setFilename(blobName);
+            if (t instanceof CacheNotFoundException cacheNotFoundException) {
+              cacheNotFoundException.setFilename(blobName);
             }
             future.setException(t);
           }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java
index 5aee1e2..2f314cb 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteExecutionService.java
@@ -460,10 +460,10 @@
       return (priorFuture != null ? priorFuture : freshFuture).join();
     } catch (CompletionException e) {
       Throwable cause = checkNotNull(e.getCause());
-      if (cause instanceof IOException) {
-        throw (IOException) cause;
-      } else if (cause instanceof ForbiddenActionInputException) {
-        throw (ForbiddenActionInputException) cause;
+      if (cause instanceof IOException ioException) {
+        throw ioException;
+      } else if (cause instanceof ForbiddenActionInputException forbiddenActionInputException) {
+        throw forbiddenActionInputException;
       } else {
         checkState(cause instanceof RuntimeException);
         throw (RuntimeException) cause;
@@ -1340,8 +1340,8 @@
   }
 
   private static String prettyPrint(ActionInput actionInput) {
-    if (actionInput instanceof Artifact) {
-      return ((Artifact) actionInput).prettyPrint();
+    if (actionInput instanceof Artifact artifact) {
+      return artifact.prettyPrint();
     } else {
       return actionInput.getExecPathString();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java
index 8942678..909de72 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteLeaseExtension.java
@@ -201,8 +201,8 @@
       if (!missingDigests.contains(buildDigest(metadata))) {
         metadata.extendExpireAtEpochMilli(expireAtEpochMilli);
         if (token != null) {
-          if (artifact instanceof TreeFileArtifact) {
-            token.extendOutputTreeFile((TreeFileArtifact) artifact, expireAtEpochMilli);
+          if (artifact instanceof TreeFileArtifact treeFileArtifact) {
+            token.extendOutputTreeFile(treeFileArtifact, expireAtEpochMilli);
           } else {
             token.extendOutputFile(artifact, expireAtEpochMilli);
           }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
index 97f9b4c..17e3300 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteModule.java
@@ -190,8 +190,8 @@
         boolean retry = false;
         if (e instanceof ClosedChannelException) {
           retry = true;
-        } else if (e instanceof HttpException) {
-          int status = ((HttpException) e).response().status().code();
+        } else if (e instanceof HttpException httpException) {
+          int status = httpException.response().status().code();
           retry =
               status == HttpResponseStatus.INTERNAL_SERVER_ERROR.code()
                   || status == HttpResponseStatus.BAD_GATEWAY.code()
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java
index 403af13..d56ca4f 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java
@@ -37,8 +37,8 @@
   @Nullable
   private static Status fromException(Exception e) {
     for (Throwable cause = e; cause != null; cause = cause.getCause()) {
-      if (cause instanceof StatusRuntimeException) {
-        return ((StatusRuntimeException) cause).getStatus();
+      if (cause instanceof StatusRuntimeException statusRuntimeException) {
+        return statusRuntimeException.getStatus();
       }
     }
     return null;
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrierUtils.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrierUtils.java
index dac7bf7..4e17a89 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrierUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrierUtils.java
@@ -22,10 +22,10 @@
 public final class RemoteRetrierUtils {
 
   public static boolean causedByStatus(Throwable e, Status.Code expected) {
-    if (e instanceof StatusRuntimeException) {
-      return ((StatusRuntimeException) e).getStatus().getCode() == expected;
-    } else if (e instanceof StatusException) {
-      return ((StatusException) e).getStatus().getCode() == expected;
+    if (e instanceof StatusRuntimeException statusRuntimeException) {
+      return statusRuntimeException.getStatus().getCode() == expected;
+    } else if (e instanceof StatusException statusException) {
+      return statusException.getStatus().getCode() == expected;
     } else if (e.getCause() != null) {
       return causedByStatus(e.getCause(), expected);
     }
@@ -33,8 +33,8 @@
   }
 
   public static boolean causedByExecTimeout(Throwable e) {
-    if (e instanceof ExecutionStatusException) {
-      return ((ExecutionStatusException) e).isExecutionTimeout();
+    if (e instanceof ExecutionStatusException executionStatusException) {
+      return executionStatusException.isExecutionTimeout();
     } else if (e.getCause() != null) {
       return causedByExecTimeout(e.getCause());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/remote/common/BulkTransferException.java b/src/main/java/com/google/devtools/build/lib/remote/common/BulkTransferException.java
index 6bf7c9d..543abee 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/common/BulkTransferException.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/common/BulkTransferException.java
@@ -45,10 +45,10 @@
    * filter and record whether all suppressed exceptions are CacheNotFoundExceptions.
    */
   public void add(IOException e) {
-    if (e instanceof BulkTransferException) {
-      for (Throwable t : ((BulkTransferException) e).getSuppressed()) {
+    if (e instanceof BulkTransferException bulkTransferException) {
+      for (Throwable t : bulkTransferException.getSuppressed()) {
         checkState(t instanceof IOException);
-        add((IOException) t);
+        add(bulkTransferException);
       }
       return;
     }
@@ -62,8 +62,8 @@
   }
 
   public static boolean anyCausedByCacheNotFoundException(Throwable e) {
-    return e instanceof BulkTransferException
-        && ((BulkTransferException) e).anyCausedByCacheNotFoundException();
+    return e instanceof BulkTransferException bulkTransferException
+        && bulkTransferException.anyCausedByCacheNotFoundException();
   }
 
   public boolean allCausedByCacheNotFoundException() {
@@ -71,8 +71,8 @@
   }
 
   public static boolean allCausedByCacheNotFoundException(Throwable e) {
-    return e instanceof BulkTransferException
-        && ((BulkTransferException) e).allCausedByCacheNotFoundException();
+    return e instanceof BulkTransferException bulkTransferException
+        && bulkTransferException.allCausedByCacheNotFoundException();
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/remote/common/LazyFileOutputStream.java b/src/main/java/com/google/devtools/build/lib/remote/common/LazyFileOutputStream.java
index 44b3e44..2c5891f 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/common/LazyFileOutputStream.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/common/LazyFileOutputStream.java
@@ -68,8 +68,8 @@
    */
   public void syncIfPossible() throws IOException {
     ensureOpen();
-    if (out instanceof FileOutputStream) {
-      ((FileOutputStream) out).getFD().sync();
+    if (out instanceof FileOutputStream fileOutputStream) {
+      fileOutputStream.getFD().sync();
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java b/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
index 1c4b51b..3d036a4 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/http/HttpCacheClient.java
@@ -540,8 +540,8 @@
                             // Unsafe.throwException to
                             // re-throw a checked exception that hasn't been declared in the method
                             // signature.
-                            if (cause instanceof HttpException) {
-                              HttpResponse response = ((HttpException) cause).response();
+                            if (cause instanceof HttpException httpException) {
+                              HttpResponse response = httpException.response();
                               if (!dataWritten.get() && authTokenExpired(response)) {
                                 // The error is due to an auth token having expired. Let's try
                                 // again.
@@ -589,8 +589,8 @@
                             outerF.set(null);
                           } else {
                             Throwable cause = f.cause();
-                            if (cause instanceof HttpException) {
-                              HttpResponse response = ((HttpException) cause).response();
+                            if (cause instanceof HttpException httpException) {
+                              HttpResponse response = httpException.response();
                               if (cacheMiss(response.status())) {
                                 outerF.setException(new CacheNotFoundException(cmd.digest()));
                                 return;
@@ -667,8 +667,8 @@
                           result.set(null);
                         } else {
                           Throwable cause = f.cause();
-                          if (cause instanceof HttpException) {
-                            HttpResponse response = ((HttpException) cause).response();
+                          if (cause instanceof HttpException httpException) {
+                            HttpResponse response = httpException.response();
                             try {
                               // If the error is due to an expired auth token and we can reset
                               // the input stream, then try again.
@@ -754,9 +754,9 @@
       in.reset();
       return true;
     }
-    if (in instanceof FileInputStream) {
+    if (in instanceof FileInputStream fileInputStream) {
       // FileInputStream does not support reset().
-      ((FileInputStream) in).getChannel().position(0);
+      fileInputStream.getChannel().position(0);
       return true;
     }
     return false;
diff --git a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java
index 5b5b401..561329f 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/http/HttpDownloadHandler.java
@@ -74,8 +74,8 @@
     }
     checkState(userPromise != null, "response before request");
 
-    if (msg instanceof HttpResponse) {
-      response = (HttpResponse) msg;
+    if (msg instanceof HttpResponse httpResponse) {
+      response = httpResponse;
       if (!response.protocolVersion().equals(HttpVersion.HTTP_1_1)) {
         HttpException error =
             new HttpException(
diff --git a/src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java b/src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java
index c5aa657..6d5260c 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/util/RxUtils.java
@@ -83,8 +83,8 @@
         .toSingleDefault(TransferResult.ok())
         .onErrorResumeNext(
             error -> {
-              if (error instanceof IOException) {
-                return Single.just(TransferResult.error((IOException) error));
+              if (error instanceof IOException ioException) {
+                return Single.just(TransferResult.error(ioException));
               } else if (error instanceof InterruptedException) {
                 return Single.just(TransferResult.interrupted());
               } else {
diff --git a/src/main/java/com/google/devtools/build/lib/remote/util/Utils.java b/src/main/java/com/google/devtools/build/lib/remote/util/Utils.java
index 61c4c4f..327d58e 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/util/Utils.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/util/Utils.java
@@ -112,14 +112,14 @@
       throw new InterruptedException();
     } catch (ExecutionException e) {
       Throwable cause = e.getCause();
-      if (cause instanceof InterruptedException) {
-        throw (InterruptedException) cause;
+      if (cause instanceof InterruptedException interruptedException) {
+        throw interruptedException;
       }
-      if (cause instanceof IOException) {
-        throw (IOException) cause;
+      if (cause instanceof IOException ioException) {
+        throw ioException;
       }
-      if (cause instanceof RuntimeException) {
-        throw (RuntimeException) cause;
+      if (cause instanceof RuntimeException runtimeException) {
+        throw runtimeException;
       }
       throw new IOException(cause);
     } catch (InterruptedException e) {
@@ -390,8 +390,8 @@
 
   public static String grpcAwareErrorMessage(Throwable error, boolean verboseFailures) {
     String errorMessage;
-    if (error instanceof IOException) {
-      errorMessage = grpcAwareErrorMessage((IOException) error);
+    if (error instanceof IOException ioException) {
+      errorMessage = grpcAwareErrorMessage(ioException);
     } else {
       errorMessage = error.getMessage();
     }
@@ -641,8 +641,8 @@
                   var cause = e.getCause();
                   if (cause instanceof InterruptedException) {
                     return immediateFailedFuture(cause);
-                  } else if (cause instanceof IOException) {
-                    error = (IOException) cause;
+                  } else if (cause instanceof IOException ioException) {
+                    error = ioException;
                   } else {
                     error = new IOException(cause);
                   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
index 69d2f40..509e317 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDex2OatInfo.java
@@ -49,8 +49,8 @@
       return new AndroidDex2OatInfo(
           enabled,
           executeDex2OatOnHost,
-          sandboxForPregeneratingOatFilesForTests instanceof FilesToRunProvider
-              ? (FilesToRunProvider) sandboxForPregeneratingOatFilesForTests
+          sandboxForPregeneratingOatFilesForTests instanceof FilesToRunProvider filesToRunProvider
+              ? filesToRunProvider
               : null,
           framework instanceof Artifact ? (Artifact) framework : null,
           dalvikCache instanceof Artifact ? (Artifact) dalvikCache : null,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
index 63a0fde..0fdcacf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java
@@ -368,10 +368,10 @@
       JavaOutput resourceJarJavaOutput;
       if (isNone(resourceJar)) {
         resourceJarJavaOutput = null;
-      } else if (resourceJar instanceof JavaOutput) {
-        resourceJarJavaOutput = (JavaOutput) resourceJar;
-      } else if (resourceJar instanceof StructImpl) {
-        resourceJarJavaOutput = JavaOutput.fromStarlarkJavaOutput((StructImpl) resourceJar);
+      } else if (resourceJar instanceof JavaOutput javaOutput) {
+        resourceJarJavaOutput = javaOutput;
+      } else if (resourceJar instanceof StructImpl structImpl) {
+        resourceJarJavaOutput = JavaOutput.fromStarlarkJavaOutput(structImpl);
       } else {
         throw new EvalException(
             "resource_jar is not None, a native JavaOutput, nor a Starlark JavaOutput");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
index e102274..1deecae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
@@ -261,8 +261,8 @@
       Preconditions.checkArgument(
           from instanceof Depset || from == net.starlark.java.eval.Starlark.UNBOUND);
 
-      if (from instanceof Depset) {
-        return nestedSet((Depset) from, with, fieldName);
+      if (from instanceof Depset depset) {
+        return nestedSet(depset, with, fieldName);
       }
       return NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
index b98771d..2943118 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ResourceApk.java
@@ -273,8 +273,8 @@
   // TODO(b/77574966): Remove this cast once we get rid of ResourceContainer and can guarantee
   // that only properly merged resources are passed into this object.
   Optional<AndroidManifestInfo> toManifestInfo() {
-    if (validatedResources instanceof ValidatedAndroidResources) {
-      ValidatedAndroidResources validated = (ValidatedAndroidResources) validatedResources;
+    if (validatedResources instanceof ValidatedAndroidResources validatedAndroidResources) {
+      ValidatedAndroidResources validated = validatedAndroidResources;
 
       return Optional.of(validated.getStampedManifest().toProvider());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTaggedTrimmingTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTaggedTrimmingTransitionFactory.java
index 46fe073..aa0859e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTaggedTrimmingTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTaggedTrimmingTransitionFactory.java
@@ -83,8 +83,10 @@
 
     @Override
     public boolean equals(Object other) {
-      return other instanceof ConfigFeatureFlagTaggedTrimmingTransition
-          && this.flags.equals(((ConfigFeatureFlagTaggedTrimmingTransition) other).flags);
+      return other
+              instanceof
+              ConfigFeatureFlagTaggedTrimmingTransition configFeatureFlagTaggedTrimmingTransition
+          && this.flags.equals(configFeatureFlagTaggedTrimmingTransition.flags);
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTransitionFactory.java
index c8ba9b1..d9859f5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagTransitionFactory.java
@@ -104,8 +104,8 @@
 
     @Override
     public boolean equals(Object other) {
-      return other instanceof ConfigFeatureFlagValuesTransition
-          && this.flagValues.equals(((ConfigFeatureFlagValuesTransition) other).flagValues);
+      return other instanceof ConfigFeatureFlagValuesTransition configFeatureFlagValuesTransition
+          && this.flagValues.equals(configFeatureFlagValuesTransition.flagValues);
     }
 
     @Override
@@ -157,8 +157,8 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof ConfigFeatureFlagTransitionFactory
-        && this.attributeName.equals(((ConfigFeatureFlagTransitionFactory) other).attributeName);
+    return other instanceof ConfigFeatureFlagTransitionFactory configFeatureFlagTransitionFactory
+        && this.attributeName.equals(configFeatureFlagTransitionFactory.attributeName);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigStarlarkCommon.java
index 59e28c9..8c9c061 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigStarlarkCommon.java
@@ -45,8 +45,8 @@
       Object name, boolean mandatory, StarlarkThread thread) throws EvalException {
 
     Label label;
-    if (name instanceof Label) {
-      label = (Label) name;
+    if (name instanceof Label nameLabel) {
+      label = nameLabel;
     } else if (name instanceof String) {
       LabelConverter converter = LabelConverter.forBzlEvaluatingThread(thread);
       try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index 237e197..c7ceaff 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -1190,8 +1190,8 @@
     }
 
     ActionOwner actionOwner = null;
-    if (actionConstructionContext instanceof RuleContext
-        && ((RuleContext) actionConstructionContext).useAutoExecGroups()) {
+    if (actionConstructionContext instanceof RuleContext ruleContext
+        && ruleContext.useAutoExecGroups()) {
       actionOwner = actionConstructionContext.getActionOwner(semantics.getCppToolchainType());
     }
     try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
index cdb1c1a..8a187b5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
@@ -385,10 +385,10 @@
     ImmutableList.Builder<CToolchain.FlagGroup> flagGroups = ImmutableList.builder();
     ImmutableList.Builder<String> flags = ImmutableList.builder();
     for (Expandable expandable : flagGroup.getExpandables()) {
-      if (expandable instanceof FlagGroup) {
-        flagGroups.add(flagGroupToProto((FlagGroup) expandable));
-      } else if (expandable instanceof SingleChunkFlag) {
-        flags.add(((SingleChunkFlag) expandable).getString());
+      if (expandable instanceof FlagGroup expandableFlagGroup) {
+        flagGroups.add(flagGroupToProto(expandableFlagGroup));
+      } else if (expandable instanceof SingleChunkFlag singleChunkFlag) {
+        flags.add(singleChunkFlag.getString());
       } else if (expandable instanceof CcToolchainFeatures.Flag) {
         flags.add(((CcToolchainFeatures.Flag) expandable).getString());
       } else {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
index c17919d..501452e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainVariables.java
@@ -355,13 +355,13 @@
       structuredVariableCache.putIfAbsent(name, variableOrError);
     }
 
-    if (variableOrError instanceof VariableValue) {
-      return (VariableValue) variableOrError;
+    if (variableOrError instanceof VariableValue variableValue) {
+      return variableValue;
     }
     if (throwOnMissingVariable) {
       throw new ExpansionException(
-          variableOrError instanceof String
-              ? (String) variableOrError
+          variableOrError instanceof String string
+              ? string
               : String.format(
                   "Invalid toolchain configuration: Cannot find variable named '%s'.", name));
     }
@@ -1449,8 +1449,8 @@
     VariableValue getNonStructuredVariable(String name) {
       if (keyToIndex.containsKey(name)) {
         Object o = values.get(keyToIndex.get(name));
-        if (o instanceof String) {
-          return new StringValue((String) o);
+        if (o instanceof String string) {
+          return new StringValue(string);
         }
         return (VariableValue) o;
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
index 987c1fb..6234a14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileActionBuilder.java
@@ -84,8 +84,8 @@
       CppSemantics cppSemantics) {
 
     ActionOwner actionOwner = null;
-    if (actionConstructionContext instanceof RuleContext
-        && ((RuleContext) actionConstructionContext).useAutoExecGroups()) {
+    if (actionConstructionContext instanceof RuleContext ruleContext
+        && ruleContext.useAutoExecGroups()) {
       actionOwner = actionConstructionContext.getActionOwner(cppSemantics.getCppToolchainType());
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoCompilationContext.java
index 976dd79..002e4fa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/LtoCompilationContext.java
@@ -155,8 +155,8 @@
     if (this == o) {
       return true;
     }
-    return (o instanceof LtoCompilationContext)
-        && ltoBitcodeFiles.equals(((LtoCompilationContext) o).ltoBitcodeFiles);
+    return o instanceof LtoCompilationContext ltoCompilationContext
+        && ltoBitcodeFiles.equals(ltoCompilationContext.ltoBitcodeFiles);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/StarlarkDefinedLinkTimeLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/StarlarkDefinedLinkTimeLibrary.java
index 2ef8f37..c768ed8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/StarlarkDefinedLinkTimeLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/StarlarkDefinedLinkTimeLibrary.java
@@ -224,8 +224,8 @@
       }
       for (String key : library.objectMap.keySet()) {
         Object value = library.objectMap.get(key);
-        if (value instanceof Depset) {
-          depsetMapBuilder.computeIfAbsent(key, k -> ImmutableList.builder()).add((Depset) value);
+        if (value instanceof Depset depset) {
+          depsetMapBuilder.computeIfAbsent(key, k -> ImmutableList.builder()).add(depset);
         } else {
           constantsMap.put(key, value);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryDirectPackageProviderFactory.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryDirectPackageProviderFactory.java
index 3f44a6d..5f7854c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryDirectPackageProviderFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQueryDirectPackageProviderFactory.java
@@ -393,9 +393,7 @@
               fromRule.getLabel(),
               toLabel);
       AdvertisedProviderSet advertisedProviderSet =
-          toTarget instanceof Rule
-              ? ((Rule) toTarget).getRuleClassObject().getAdvertisedProviders()
-              : null;
+          toTarget instanceof Rule rule ? rule.getRuleClassObject().getAdvertisedProviders() : null;
       if (advertisedProviderSet != null
           && AspectDefinition.satisfies(aspect, advertisedProviderSet)) {
         return true;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationInfoProvider.java
index c812352..b17a713 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationInfoProvider.java
@@ -76,8 +76,8 @@
       throws EvalException, RuleErrorException {
     if (value == null || value == Starlark.NONE) {
       return null;
-    } else if (value instanceof JavaCompilationInfoProvider) {
-      return (JavaCompilationInfoProvider) value;
+    } else if (value instanceof JavaCompilationInfoProvider javaCompilationInfoProvider) {
+      return javaCompilationInfoProvider;
     } else if (value instanceof StructImpl info) {
       Builder builder =
           new Builder()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
index 35525a5..d0a4fb4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
@@ -89,8 +89,8 @@
   static JavaGenJarsProvider from(Object obj) throws EvalException {
     if (obj == null || obj == Starlark.NONE) {
       return EMPTY;
-    } else if (obj instanceof JavaGenJarsProvider) {
-      return (JavaGenJarsProvider) obj;
+    } else if (obj instanceof JavaGenJarsProvider javaGenJarsProvider) {
+      return javaGenJarsProvider;
     } else if (obj instanceof StructImpl struct) {
       return new AutoValue_JavaGenJarsProvider_NativeJavaGenJarsProvider(
           struct.getValue("enabled", Boolean.class),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 8d449cc..445ef1d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -581,8 +581,8 @@
 
     @Override
     public JavaInfo wrap(Info info) throws RuleErrorException {
-      if (info instanceof JavaInfo) {
-        return (JavaInfo) info;
+      if (info instanceof JavaInfo javaInfo) {
+        return javaInfo;
       } else if (info instanceof StructImpl) {
         try {
           return new JavaInfo((StructImpl) info);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaModuleFlagsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaModuleFlagsProvider.java
index ea016e3..5adcb5a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaModuleFlagsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaModuleFlagsProvider.java
@@ -127,8 +127,8 @@
     Object value = javaInfo.getValue("module_flags_info");
     if (value == null || value == Starlark.NONE) {
       return null;
-    } else if (value instanceof JavaModuleFlagsProvider) {
-      return (JavaModuleFlagsProvider) value;
+    } else if (value instanceof JavaModuleFlagsProvider javaModuleFlagsProvider) {
+      return javaModuleFlagsProvider;
     } else if (value instanceof StructImpl moduleFlagsInfo) {
       return JavaModuleFlagsProvider.create(
           moduleFlagsInfo.getValue("add_exports", Depset.class).toList(String.class),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationProvider.java
index cec8672..cd6f81c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfigurationProvider.java
@@ -102,8 +102,8 @@
 
     @Override
     public JavaPackageConfigurationProvider wrap(Info value) throws RuleErrorException {
-      if (value instanceof StructImpl) {
-        return new JavaPackageConfigurationProvider((StructImpl) value);
+      if (value instanceof StructImpl structImpl) {
+        return new JavaPackageConfigurationProvider(structImpl);
       } else {
         throw new RuleErrorException(
             "expected an instance of JavaPackageConfigurationProvider, got: "
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfo.java
index 5477280..4c95ac0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfo.java
@@ -96,8 +96,8 @@
       if (value instanceof JavaInfo) {
         // needed because currently native JavaInfo extends JavaPluginInfo
         throw new RuleErrorException("got element of type JavaInfo, want JavaPluginInfo");
-      } else if (value instanceof JavaPluginInfo) {
-        return (JavaPluginInfo) value;
+      } else if (value instanceof JavaPluginInfo javaPluginInfo) {
+        return javaPluginInfo;
       } else if (value instanceof StructImpl) {
         try {
           StructImpl info = (StructImpl) value;
@@ -154,8 +154,8 @@
     }
 
     public static JavaPluginData wrap(Object obj) throws EvalException, RuleErrorException {
-      if (obj instanceof JavaPluginData) {
-        return (JavaPluginData) obj;
+      if (obj instanceof JavaPluginData javaPluginData) {
+        return javaPluginData;
       } else if (obj instanceof StructImpl struct) {
         return JavaPluginData.create(
             Depset.cast(struct.getValue("processor_classes"), String.class, "processor_classes"),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
index 56cf020..98bc22e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -74,10 +74,10 @@
         throws EvalException, RuleErrorException {
       ImmutableList.Builder<JavaOutput> result = ImmutableList.builder();
       for (Object info : outputs) {
-        if (info instanceof JavaOutput) {
-          result.add((JavaOutput) info);
-        } else if (info instanceof StructImpl) {
-          result.add(fromStarlarkJavaOutput((StructImpl) info));
+        if (info instanceof JavaOutput javaOutput) {
+          result.add(javaOutput);
+        } else if (info instanceof StructImpl structImpl) {
+          result.add(fromStarlarkJavaOutput(structImpl));
         } else {
           throw new RuleErrorException("expected JavaOutput, got: " + Starlark.type(info));
         }
@@ -353,8 +353,8 @@
       throws EvalException, RuleErrorException {
     if (obj == Starlark.NONE) {
       return JavaRuleOutputJarsProvider.EMPTY;
-    } else if (obj instanceof JavaRuleOutputJarsProvider) {
-      return (JavaRuleOutputJarsProvider) obj;
+    } else if (obj instanceof JavaRuleOutputJarsProvider javaRuleOutputJarsProvider) {
+      return javaRuleOutputJarsProvider;
     } else if (obj instanceof StructImpl) {
       return JavaRuleOutputJarsProvider.builder()
           .addJavaOutput(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
index 1de0a74..2b0f5f0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
@@ -269,14 +269,14 @@
   @Override
   public String getTargetKind(Object target, StarlarkThread thread) throws EvalException {
     checkPrivateAccess(thread);
-    if (target instanceof MergedConfiguredTarget) {
-      target = ((MergedConfiguredTarget) target).getBaseConfiguredTarget();
+    if (target instanceof MergedConfiguredTarget mergedConfiguredTarget) {
+      target = mergedConfiguredTarget.getBaseConfiguredTarget();
     }
-    if (target instanceof ConfiguredTarget) {
-      target = ((ConfiguredTarget) target).getActual();
+    if (target instanceof ConfiguredTarget configuredTarget) {
+      target = configuredTarget.getActual();
     }
-    if (target instanceof AbstractConfiguredTarget) {
-      return ((AbstractConfiguredTarget) target).getRuleClassString();
+    if (target instanceof AbstractConfiguredTarget abstractConfiguredTarget) {
+      return abstractConfiguredTarget.getRuleClassString();
     }
     return "";
   }
@@ -351,10 +351,10 @@
 
   @VisibleForTesting
   static String printableType(Object elem) {
-    if (elem instanceof StarlarkInfoWithSchema) {
-      return ((StarlarkInfoWithSchema) elem).getProvider().getPrintableName();
-    } else if (elem instanceof NativeInfo) {
-      return ((NativeInfo) elem).getProvider().getPrintableName();
+    if (elem instanceof StarlarkInfoWithSchema starlarkInfoWithSchema) {
+      return starlarkInfoWithSchema.getProvider().getPrintableName();
+    } else if (elem instanceof NativeInfo nativeInfo) {
+      return nativeInfo.getProvider().getPrintableName();
     }
     return Starlark.type(elem);
   }
@@ -412,12 +412,12 @@
   }
 
   static boolean isInstanceOfProvider(Object obj, Provider provider) {
-    if (obj instanceof NativeInfo) {
-      return ((NativeInfo) obj).getProvider().getKey().equals(provider.getKey());
-    } else if (obj instanceof StarlarkInfoWithSchema) {
-      return ((StarlarkInfoWithSchema) obj).getProvider().getKey().equals(provider.getKey());
-    } else if (obj instanceof StarlarkInfoNoSchema) {
-      return ((StarlarkInfoNoSchema) obj).getProvider().getKey().equals(provider.getKey());
+    if (obj instanceof NativeInfo nativeInfo) {
+      return nativeInfo.getProvider().getKey().equals(provider.getKey());
+    } else if (obj instanceof StarlarkInfoWithSchema starlarkInfoWithSchema) {
+      return starlarkInfoWithSchema.getProvider().getKey().equals(provider.getKey());
+    } else if (obj instanceof StarlarkInfoNoSchema starlarkInfoNoSchema) {
+      return starlarkInfoNoSchema.getProvider().getKey().equals(provider.getKey());
     }
     return false;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
index 047c42a..6dd6a1d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
@@ -70,8 +70,8 @@
     String name = rule.getName();
     Object pathObj = rule.getAttr("path");
     String path;
-    if (pathObj instanceof String) {
-      path = (String) pathObj;
+    if (pathObj instanceof String string) {
+      path = string;
     } else {
       path = "";
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/ModuleInfoExtractor.java b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/ModuleInfoExtractor.java
index b6a67cc..4c3e251 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/ModuleInfoExtractor.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/ModuleInfoExtractor.java
@@ -210,20 +210,20 @@
           // generated.
           return;
         }
-        if (value instanceof StarlarkRuleFunction) {
-          visitRule(qualifiedName, (StarlarkRuleFunction) value);
-        } else if (value instanceof MacroFunction) {
-          visitMacroFunction(qualifiedName, (MacroFunction) value);
-        } else if (value instanceof StarlarkProvider) {
-          visitProvider(qualifiedName, (StarlarkProvider) value);
-        } else if (value instanceof StarlarkFunction) {
-          visitFunction(qualifiedName, (StarlarkFunction) value);
-        } else if (value instanceof StarlarkDefinedAspect) {
-          visitAspect(qualifiedName, (StarlarkDefinedAspect) value);
-        } else if (value instanceof RepositoryRuleFunction) {
-          visitRepositoryRule(qualifiedName, (RepositoryRuleFunction) value);
-        } else if (value instanceof ModuleExtension) {
-          visitModuleExtension(qualifiedName, (ModuleExtension) value);
+        if (value instanceof StarlarkRuleFunction starlarkRuleFunction) {
+          visitRule(qualifiedName, starlarkRuleFunction);
+        } else if (value instanceof MacroFunction macroFunction) {
+          visitMacroFunction(qualifiedName, macroFunction);
+        } else if (value instanceof StarlarkProvider starlarkProvider) {
+          visitProvider(qualifiedName, starlarkProvider);
+        } else if (value instanceof StarlarkFunction starlarkFunction) {
+          visitFunction(qualifiedName, starlarkFunction);
+        } else if (value instanceof StarlarkDefinedAspect starlarkDefinedAspect) {
+          visitAspect(qualifiedName, starlarkDefinedAspect);
+        } else if (value instanceof RepositoryRuleFunction repositoryRuleFunction) {
+          visitRepositoryRule(qualifiedName, repositoryRuleFunction);
+        } else if (value instanceof ModuleExtension moduleExtension) {
+          visitModuleExtension(qualifiedName, moduleExtension);
         } else if (value instanceof Structure) {
           recurseIntoStructure(
               qualifiedName, (Structure) value, /* shouldVisitVerifiedForAncestor= */ true);
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
index 253974e..fdc38cb 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java
@@ -463,22 +463,22 @@
         break; // proceed
     }
 
-    if (event instanceof BuildStartingEvent) {
-      BuildRequest buildRequest = ((BuildStartingEvent) event).request();
+    if (event instanceof BuildStartingEvent buildStartingEvent) {
+      BuildRequest buildRequest = buildStartingEvent.request();
       isCommandToSkipBuildCompleteEvent =
           buildRequest.getCommandName().equals("test")
               || buildRequest.getCommandName().equals("coverage")
               || buildRequest.getCommandName().equals("run");
     }
 
-    if (event instanceof BuildEventWithConfiguration) {
-      for (BuildEvent configuration : ((BuildEventWithConfiguration) event).getConfigurations()) {
+    if (event instanceof BuildEventWithConfiguration buildEventWithConfiguration) {
+      for (BuildEvent configuration : buildEventWithConfiguration.getConfigurations()) {
         maybeReportConfiguration(configuration);
       }
     }
 
-    if (event instanceof EventReportingArtifacts) {
-      ReportedArtifacts reportedArtifacts = ((EventReportingArtifacts) event).reportedArtifacts();
+    if (event instanceof EventReportingArtifacts eventReportingArtifacts) {
+      ReportedArtifacts reportedArtifacts = eventReportingArtifacts.reportedArtifacts();
       for (NestedSet<Artifact> artifactSet : reportedArtifacts.artifacts) {
         maybeReportArtifactSet(reportedArtifacts.completionContext, artifactSet);
       }
@@ -516,8 +516,8 @@
       buildComplete(event);
     }
 
-    if (event instanceof NoBuildEvent) {
-      if (!((NoBuildEvent) event).separateFinishedEvent()) {
+    if (event instanceof NoBuildEvent noBuildEvent) {
+      if (!noBuildEvent.separateFinishedEvent()) {
         buildComplete(event);
       }
     }
@@ -712,8 +712,8 @@
 
   /** Returns whether a {@link BuildEvent} should be ignored or was buffered. */
   private RetentionDecision routeBuildEvent(BuildEvent event) {
-    if (event instanceof ActionExecutedEvent
-        && !shouldPublishActionExecutedEvent((ActionExecutedEvent) event)) {
+    if (event instanceof ActionExecutedEvent actionExecutedEvent
+        && !shouldPublishActionExecutedEvent(actionExecutedEvent)) {
       return RetentionDecision.DISCARD;
     }
 
@@ -761,7 +761,7 @@
       // Publish all new logs with inputs and input sizes
       return true;
     }
-    return (event.getAction() instanceof ExtraAction);
+    return event.getAction() instanceof ExtraAction;
   }
 
   private synchronized boolean bufferUntilPrerequisitesReceived(BuildEvent event) {
@@ -780,7 +780,7 @@
 
   /** Return true if the test summary contains no actual test runs. */
   private static boolean isVacuousTestSummary(BuildEvent event) {
-    return event instanceof TestSummary && (((TestSummary) event).totalRuns() == 0);
+    return event instanceof TestSummary && ((TestSummary) event).totalRuns() == 0;
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
index 82003fb..f966cbd 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/mobileinstall/MobileInstallCommand.java
@@ -408,8 +408,8 @@
     // Dereference any aliases that might be present.
     target = target.getActual();
 
-    if (target instanceof AbstractConfiguredTarget) {
-      String ruleType = ((AbstractConfiguredTarget) target).getRuleClassString();
+    if (target instanceof AbstractConfiguredTarget abstractConfiguredTarget) {
+      String ruleType = abstractConfiguredTarget.getRuleClassString();
       if (!mobileInstallSupportedRules.contains(ruleType)) {
         return String.format(
             "mobile-install can only be run on %s targets. Got: %s",
diff --git a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java
index 35e4e0e..92275a4 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/Consumers.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/Consumers.java
@@ -199,8 +199,8 @@
           // unpack and re-throw the IOException. Otherwise, re-throw
           // this unexpected RuntimeException
           final Throwable cause = re.getCause();
-          if (cause instanceof IOException) {
-            throw (IOException) cause;
+          if (cause instanceof IOException ioException) {
+            throw ioException;
           } else {
             throw re;
           }
diff --git a/src/main/java/com/google/devtools/build/lib/shell/TerminationStatus.java b/src/main/java/com/google/devtools/build/lib/shell/TerminationStatus.java
index 5fcb1ff..072c100 100644
--- a/src/main/java/com/google/devtools/build/lib/shell/TerminationStatus.java
+++ b/src/main/java/com/google/devtools/build/lib/shell/TerminationStatus.java
@@ -243,8 +243,8 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof TerminationStatus
-        && ((TerminationStatus) other).waitResult == this.waitResult;
+    return other instanceof TerminationStatus terminationStatus
+        && terminationStatus.waitResult == this.waitResult;
   }
 
   /** Returns a new {@link TerminationStatus.Builder}. */
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
index b89bd01..746093d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AbstractLabelCycleReporter.java
@@ -50,8 +50,8 @@
 
   /** Returns the String representation of the {@code SkyKey}. */
   protected String prettyPrint(Object rawKey) {
-    if (rawKey instanceof ActionLookupKey) {
-      return ((ActionLookupKey) rawKey).getLabel().toString();
+    if (rawKey instanceof ActionLookupKey actionLookupKey) {
+      return actionLookupKey.getLabel().toString();
     }
     return getLabel((SkyKey) rawKey).toString();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
index f96186b..642f740 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionArtifactCycleReporter.java
@@ -54,8 +54,8 @@
    * #shouldSkipOnPathToCycle}
    */
   private static String prettyPrint(SkyFunctionName skyFunctionName, Object arg) {
-    if (arg instanceof Artifact) {
-      return prettyPrintArtifact(((Artifact) arg));
+    if (arg instanceof Artifact artifact) {
+      return prettyPrintArtifact(artifact);
     } else if (arg instanceof ActionLookupData) {
       return "action from: " + arg;
     } else if (arg instanceof TopLevelActionLookupKeyWrapper key) {
@@ -87,13 +87,13 @@
   @Override
   protected Label getLabel(SkyKey key) {
     Object arg = key.argument();
-    if (arg instanceof Artifact) {
-      return ((Artifact) arg).getOwner();
-    } else if (arg instanceof ActionLookupData) {
-      return ((ActionLookupData) arg).getLabel();
-    } else if (arg instanceof TopLevelActionLookupKeyWrapper) {
-      return ((TopLevelActionLookupKeyWrapper) arg).actionLookupKey().getLabel();
-    } else if (arg instanceof TestCompletionKey
+    if (arg instanceof Artifact artifact) {
+      return artifact.getOwner();
+    } else if (arg instanceof ActionLookupData actionLookupData) {
+      return actionLookupData.getLabel();
+    } else if (arg instanceof TopLevelActionLookupKeyWrapper topLevelActionLookupKeyWrapper) {
+      return topLevelActionLookupKeyWrapper.actionLookupKey().getLabel();
+    } else if (arg instanceof TestCompletionKey testCompletionKey
         && key.functionName().equals(SkyFunctions.TEST_COMPLETION)) {
       return ((TestCompletionKey) arg).configuredTargetKey().getLabel();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
index f599087..023a3e2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -1061,8 +1061,8 @@
             input, ((ActionExecutionValue) retrievedMetadata).getExistingFileArtifactValue(input));
       } else if (retrievedMetadata instanceof MissingArtifactValue) {
         inputData.putWithNoDepOwner(input, FileArtifactValue.MISSING_FILE_MARKER);
-      } else if (retrievedMetadata instanceof FileArtifactValue) {
-        inputData.putWithNoDepOwner(input, (FileArtifactValue) retrievedMetadata);
+      } else if (retrievedMetadata instanceof FileArtifactValue fileArtifactValue) {
+        inputData.putWithNoDepOwner(input, fileArtifactValue);
       } else {
         throw new IllegalStateException(
             "unknown metadata for " + input.getExecPathString() + ": " + retrievedMetadata);
@@ -1642,8 +1642,8 @@
     }
 
     private void handleActionExecutionExceptionFromSkykey(SkyKey key, ActionExecutionException e) {
-      if (key instanceof Artifact) {
-        handleActionExecutionExceptionPerArtifact((Artifact) key, e);
+      if (key instanceof Artifact artifact) {
+        handleActionExecutionExceptionPerArtifact(artifact, e);
         return;
       }
       Set<Artifact> associatedInputs = skyKeyToDerivedArtifactSetForExceptions.get().get(key);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionState.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionState.java
index fa7141c..bff051b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionState.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionState.java
@@ -390,8 +390,8 @@
 
     @Override
     public ActionExecutionValue get() throws ActionExecutionException, InterruptedException {
-      if (e instanceof InterruptedException) {
-        throw (InterruptedException) e;
+      if (e instanceof InterruptedException interruptedException) {
+        throw interruptedException;
       }
       throw (ActionExecutionException) e;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
index ecdea6f..87c9901 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
@@ -141,8 +141,8 @@
         actionOutputMetadataStore.getAllArtifactData(),
         actionOutputMetadataStore.getAllTreeArtifactData(),
         outputSymlinks,
-        action instanceof IncludeScannable
-            ? ((IncludeScannable) action).getDiscoveredModules()
+        action instanceof IncludeScannable includeScannable
+            ? includeScannable.getDiscoveredModules()
             : NestedSetBuilder.emptySet(Order.STABLE_ORDER));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStore.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStore.java
index a6ebff5..9af32fd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStore.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionOutputMetadataStore.java
@@ -686,8 +686,8 @@
       return FileArtifactValue.createForDirectoryWithMtime(stat.getLastModifiedTime());
     }
 
-    if (stat instanceof FileStatusWithMetadata) {
-      return ((FileStatusWithMetadata) stat).getMetadata();
+    if (stat instanceof FileStatusWithMetadata fileStatusWithMetadata) {
+      return fileStatusWithMetadata.getMetadata();
     }
 
     FileStateValue fileStateValue =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
index 40f725c..59ada98 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java
@@ -123,8 +123,8 @@
     AspectsList.Builder builder = new AspectsList.Builder();
 
     for (AspectClass aspectClass : topLevelAspectsClasses) {
-      if (aspectClass instanceof StarlarkAspectClass) {
-        StarlarkAspect starlarkAspect = loadStarlarkAspect(env, (StarlarkAspectClass) aspectClass);
+      if (aspectClass instanceof StarlarkAspectClass starlarkAspectClass) {
+        StarlarkAspect starlarkAspect = loadStarlarkAspect(env, starlarkAspectClass);
         if (starlarkAspect == null) {
           return null;
         }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
index 7c17bf8..ba6d18f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java
@@ -1136,8 +1136,8 @@
     ImmutableList.Builder<Pair<String, Location>> loads = ImmutableList.builder();
     for (StarlarkFile file : files) {
       for (Statement stmt : file.getStatements()) {
-        if (stmt instanceof LoadStatement) {
-          StringLiteral module = ((LoadStatement) stmt).getImport();
+        if (stmt instanceof LoadStatement loadStatement) {
+          StringLiteral module = loadStatement.getImport();
           loads.add(Pair.of(module.getValue(), module.getStartLocation()));
         }
       }
@@ -1536,8 +1536,8 @@
           String.format(
               "Encountered error while reading extension file '%s': %s", file, cause.getMessage());
     DetailedExitCode detailedExitCode =
-        cause instanceof DetailedException
-            ? ((DetailedException) cause).getDetailedExitCode()
+        cause instanceof DetailedException detailedException
+            ? detailedException.getDetailedExitCode()
             : BzlLoadFailedException.createDetailedExitCode(
                 errorMessage, Code.CONTAINING_PACKAGE_NOT_FOUND);
       return new BzlLoadFailedException(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
index 850bf37..9298ac9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlmodRepoRuleFunction.java
@@ -307,8 +307,8 @@
       RepoSpec repoSpec, ImmutableMap<String, Module> loadedModules)
       throws BzlmodRepoRuleFunctionException {
     Object object = loadedModules.get(repoSpec.bzlFile()).getGlobal(repoSpec.ruleClassName());
-    if (object instanceof RuleFunction) {
-      return ((RuleFunction) object).getRuleClass();
+    if (object instanceof RuleFunction ruleFunction) {
+      return ruleFunction.getRuleClass();
     } else {
       InvalidRuleException e =
           new InvalidRuleException("Invalid repository rule: " + repoSpec.getRuleClass());
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentValue.java
index 4357e23..99b9870 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentValue.java
@@ -37,8 +37,8 @@
 
   @Override
   public boolean equals(Object o) {
-    return (o instanceof ClientEnvironmentValue)
-        && Objects.equals(((ClientEnvironmentValue) o).value, value);
+    return o instanceof ClientEnvironmentValue clientEnvironmentValue
+        && Objects.equals(clientEnvironmentValue.value, value);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DefaultSyscallCache.java b/src/main/java/com/google/devtools/build/lib/skyframe/DefaultSyscallCache.java
index 1674344..cc1c024 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DefaultSyscallCache.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DefaultSyscallCache.java
@@ -161,8 +161,8 @@
   @SuppressWarnings("unchecked")
   public Collection<Dirent> readdir(Path path) throws IOException {
     Object result = readdirCache.get(path);
-    if (result instanceof IOException) {
-      throw (IOException) result;
+    if (result instanceof IOException ioException) {
+      throw ioException;
     }
     return (Collection<Dirent>) result; // unchecked cast
   }
@@ -173,14 +173,14 @@
     // Try to load a Symlinks.NOFOLLOW result first. Symlinks are rare and this enables sharing the
     // cache for all non-symlink paths.
     Object result = statCache.get(Pair.of(path, Symlinks.NOFOLLOW));
-    if (result instanceof IOException) {
-      throw (IOException) result;
+    if (result instanceof IOException ioException) {
+      throw ioException;
     }
     FileStatus status = (FileStatus) result;
     if (status != NO_STATUS && symlinks == Symlinks.FOLLOW && status.isSymbolicLink()) {
       result = statCache.get(Pair.of(path, Symlinks.FOLLOW));
-      if (result instanceof IOException) {
-        throw (IOException) result;
+      if (result instanceof IOException ioException) {
+        throw ioException;
       }
       status = (FileStatus) result;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DetailedException.java b/src/main/java/com/google/devtools/build/lib/skyframe/DetailedException.java
index a7ac7ed..0f2c269 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/DetailedException.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/DetailedException.java
@@ -22,8 +22,8 @@
 
   @Nullable
   static DetailedExitCode getDetailedExitCode(Exception exception) {
-    return exception instanceof DetailedException
-        ? ((DetailedException) exception).getDetailedExitCode()
+    return exception instanceof DetailedException detailedException
+        ? detailedException.getDetailedExitCode()
         : null;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java
index fae5c2d..72c07d9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunctionWithMultipleRecursiveFunctions.java
@@ -375,8 +375,8 @@
 
   @SuppressWarnings("unchecked") // cast to NestedSet<PathFragment>
   private static void addToMatches(Object toAdd, NestedSetBuilder<PathFragment> matches) {
-    if (toAdd instanceof PathFragment) {
-      matches.add((PathFragment) toAdd);
+    if (toAdd instanceof PathFragment pathFragment) {
+      matches.add(pathFragment);
     } else if (toAdd instanceof NestedSet) {
       matches.addTransitive((NestedSet<PathFragment>) toAdd);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalArtifactConflictFinder.java b/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalArtifactConflictFinder.java
index 7ad14e1..6afc6c72d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalArtifactConflictFinder.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/IncrementalArtifactConflictFinder.java
@@ -492,8 +492,8 @@
   private static Artifact getOwningArtifactFromTrie(Object trieNode) {
     Preconditions.checkArgument(
         trieNode instanceof Artifact || trieNode instanceof ConcurrentHashMap);
-    if (trieNode instanceof Artifact) {
-      return (Artifact) trieNode;
+    if (trieNode instanceof Artifact artifact) {
+      return artifact;
     }
     Object nodeIter = trieNode;
     while (!(nodeIter instanceof Artifact)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index b6a201d..3d88b35 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -1436,8 +1436,8 @@
         @Override
         BuildFileContainsErrorsException create(
             PackageIdentifier packId, String msg, DetailedExitCode detailedExitCode, Exception e) {
-          return e instanceof IOException
-              ? new BuildFileContainsErrorsException(packId, msg, (IOException) e, detailedExitCode)
+          return e instanceof IOException ioException
+              ? new BuildFileContainsErrorsException(packId, msg, ioException, detailedExitCode)
               : new BuildFileContainsErrorsException(packId, msg, detailedExitCode);
         }
       },
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java
index d684d9b..c67e21f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java
@@ -133,8 +133,8 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof PrepareDepsOfPatternsValue
-        && targetPatternKeys.equals(((PrepareDepsOfPatternsValue) other).getTargetPatternKeys());
+    return other instanceof PrepareDepsOfPatternsValue prepareDepsOfPatternsValue
+        && targetPatternKeys.equals(prepareDepsOfPatternsValue.getTargetPatternKeys());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
index 42e0cd9..0151bc0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java
@@ -335,8 +335,8 @@
 
         if (value instanceof FileArtifactValue || value instanceof TreeArtifactValue) {
           fsVal = (HasDigest) value;
-        } else if (value instanceof ActionExecutionValue) {
-          fsVal = ((ActionExecutionValue) value).getExistingFileArtifactValue(artifact);
+        } else if (value instanceof ActionExecutionValue actionExecutionValue) {
+          fsVal = actionExecutionValue.getExistingFileArtifactValue(artifact);
         } else {
           return NON_EXISTENT_FILE_INFO;
         }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java
index aefdb9d..8cbd4e8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java
@@ -37,8 +37,8 @@
   @Override
   public boolean equals(Object o) {
     return super.equals(o)
-        && ((o instanceof RecursivePkgSkyKey))
-        && ((RecursivePkgSkyKey) o).functionName().equals(functionName());
+        && o instanceof RecursivePkgSkyKey recursivePkgSkyKey
+        && recursivePkgSkyKey.functionName().equals(functionName());
   }
 
   /** Don't bother to memoize hashCode because {@link RecursivePkgKey#hashCode} is cheap enough. */
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
index 2c0020e..5efe5ae 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java
@@ -920,8 +920,8 @@
 
   private InputMetadataProvider createFileCache(
       InputMetadataProvider graphFileCache, @Nullable FileSystem actionFileSystem) {
-    if (actionFileSystem instanceof InputMetadataProvider) {
-      return (InputMetadataProvider) actionFileSystem;
+    if (actionFileSystem instanceof InputMetadataProvider inputMetadataProvider) {
+      return inputMetadataProvider;
     }
     return new DelegatingPairInputMetadataProvider(graphFileCache, perBuildFileCache);
   }
@@ -1122,8 +1122,8 @@
       // Action failures may be caused by lost inputs. Lost input failures have higher priority
       // because rewinding may be able to restore what was lost and allow the action to complete
       // without error.
-      if (e instanceof LostInputsActionExecutionException) {
-        lostInputsException = (LostInputsActionExecutionException) e;
+      if (e instanceof LostInputsActionExecutionException lostInputsActionExecutionException) {
+        lostInputsException = lostInputsActionExecutionException;
       } else {
         try {
           checkActionFileSystemForLostInputs(
@@ -1869,8 +1869,8 @@
     if (actionResult != null) {
       return actionResult.spawnResults();
     }
-    if (exception instanceof SpawnActionExecutionException) {
-      return ImmutableList.of(((SpawnActionExecutionException) exception).getSpawnResult());
+    if (exception instanceof SpawnActionExecutionException spawnActionExecutionException) {
+      return ImmutableList.of(spawnActionExecutionException.getSpawnResult());
     }
     return ImmutableList.of();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeErrorProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeErrorProcessor.java
index e90e586..8497791 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeErrorProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeErrorProcessor.java
@@ -551,8 +551,8 @@
       executionDetailedExitCode =
           getExecutionDetailedExitCodeFromCause(result, exception, bugReporter);
       analysisRootCauses =
-          exception instanceof ActionExecutionException
-              ? ((ActionExecutionException) exception).getRootCauses()
+          exception instanceof ActionExecutionException actionExecutionException
+              ? actionExecutionException.getRootCauses()
               : NestedSetBuilder.emptySet(Order.STABLE_ORDER);
     } else {
       BugReport.logUnexpected(
@@ -896,8 +896,8 @@
       throws BuildFailedException, TestExecException {
     Throwables.throwIfUnchecked(cause);
     Throwable innerCause = cause.getCause();
-    if (innerCause instanceof TestExecException) {
-      throw (TestExecException) innerCause;
+    if (innerCause instanceof TestExecException testExecException) {
+      throw testExecException;
     }
     if (cause instanceof ActionExecutionException actionExecutionCause) {
       String message = cause.getMessage();
@@ -914,11 +914,11 @@
           /* errorAlreadyShown= */ !actionExecutionCause.showError(),
           actionExecutionCause.getDetailedExitCode());
     }
-    if (cause instanceof InputFileErrorException) {
-      throw (InputFileErrorException) cause;
+    if (cause instanceof InputFileErrorException inputFileErrorException) {
+      throw inputFileErrorException;
     }
-    if (cause instanceof TopLevelOutputException) {
-      throw (TopLevelOutputException) cause;
+    if (cause instanceof TopLevelOutputException topLevelOutputException) {
+      throw topLevelOutputException;
     }
 
     // We encountered an exception we don't think we should have encountered. This can indicate
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 8009e05..79ddaf2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -1906,8 +1906,8 @@
       ErrorInfo error = firstError.getValue();
       Throwable e = error.getException();
       // Wrap loading failed exceptions
-      if (e instanceof NoSuchThingException) {
-        e = new InvalidConfigurationException(((NoSuchThingException) e).getDetailedExitCode(), e);
+      if (e instanceof NoSuchThingException noSuchThingException) {
+        e = new InvalidConfigurationException(noSuchThingException.getDetailedExitCode(), e);
       } else if (e == null && !error.getCycleInfo().isEmpty()) {
         cyclesReporter.reportCycles(error.getCycleInfo(), firstError.getKey(), eventHandler);
         e =
@@ -4239,8 +4239,8 @@
     graph.parallelForEach(
         node -> {
           SkyKey k = node.getKey();
-          if (k instanceof FileStateKey) {
-            RootedPath rootedPath = ((FileStateKey) k).argument();
+          if (k instanceof FileStateKey fileStateKey) {
+            RootedPath rootedPath = fileStateKey.argument();
             if (workingSetRootedPaths.contains(rootedPath)) {
               leafs.add(k);
             }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeFocuser.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeFocuser.java
index af1e3bf..b00c067 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeFocuser.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeFocuser.java
@@ -246,8 +246,8 @@
         // This is necessary to keep the action inputs encapsulated by a NestedSet. Otherwise,
         // those inputs will be missing. ActionExecutionFunction#lookupInput allows getting a
         // transitive dep without adding a SkyframeDependency on it.
-        if (dep instanceof ArtifactNestedSetKey) {
-          for (Artifact a : ((ArtifactNestedSetKey) dep).expandToArtifacts()) {
+        if (dep instanceof ArtifactNestedSetKey artifactNestedSetKey) {
+          for (Artifact a : artifactNestedSetKey.expandToArtifacts()) {
             SkyKey aKey = Artifact.key(a);
             if (keptDeps.add(aKey)) {
               maybeCollectVerificationSet(aKey);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
index f5980e6..09917ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeTargetPatternEvaluator.java
@@ -128,8 +128,8 @@
           // exception if there is a bug in error handling.
           Exception exception = error.getException();
           errorMessage = exception.getMessage();
-          if (exception instanceof TargetParsingException) {
-            targetParsingException = (TargetParsingException) exception;
+          if (exception instanceof TargetParsingException tpe) {
+            targetParsingException = tpe;
           } else {
             targetParsingException = wrapException(exception, key, key);
           }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
index 955d53f..f98bf8c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
@@ -130,8 +130,8 @@
     if (requiredConfigFragments != null) {
       builder.addProvider(requiredConfigFragments);
     }
-    if (aspectStarlarkObject instanceof Iterable) {
-      addDeclaredProviders(builder, (Iterable) aspectStarlarkObject);
+    if (aspectStarlarkObject instanceof Iterable<?> iterable) {
+      addDeclaredProviders(builder, iterable);
     } else {
       // Either an old-style struct or a single declared provider (not in a list)
       Info info = (Info) aspectStarlarkObject;
@@ -156,8 +156,8 @@
           }
         }
       } else {
-        if (info instanceof StarlarkInfo) {
-          info = ((StarlarkInfo) info).unsafeOptimizeMemoryLayout();
+        if (info instanceof StarlarkInfo starlarkInfo) {
+          info = starlarkInfo.unsafeOptimizeMemoryLayout();
         }
         builder.addStarlarkDeclaredProvider(info);
       }
@@ -178,8 +178,8 @@
                 + "a sequence of declared providers, instead got a %s at index %d",
             Starlark.type(o), i);
       }
-      if (o instanceof StarlarkInfo) {
-        o = ((StarlarkInfo) o).unsafeOptimizeMemoryLayout();
+      if (o instanceof StarlarkInfo starlarkInfo) {
+        o = starlarkInfo.unsafeOptimizeMemoryLayout();
       }
       builder.addStarlarkDeclaredProvider((Info) o);
       i++;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuildSettingsDetailsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuildSettingsDetailsFunction.java
index d285236..ea902c5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuildSettingsDetailsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuildSettingsDetailsFunction.java
@@ -224,8 +224,8 @@
       if (buildSettingTarget.getAssociatedRule().getRuleClass().equals(ALIAS_RULE_NAME)) {
         Object actualValue =
             buildSettingTarget.getAssociatedRule().getAttr(ALIAS_ACTUAL_ATTRIBUTE_NAME);
-        if (actualValue instanceof Label) {
-          actualSettingBuilder.add((Label) actualValue);
+        if (actualValue instanceof Label label) {
+          actualSettingBuilder.add(label);
           continue;
         } else if (actualValue instanceof SelectorList) {
           // configured "actual" value
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCycleReporter.java
index 69fdac1..6166b1a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCycleReporter.java
@@ -65,10 +65,10 @@
 
   @Override
   public String prettyPrint(Object key) {
-    if (key instanceof ConfiguredTargetKey) {
-      return ((ConfiguredTargetKey) key).prettyPrint();
-    } else if (key instanceof AspectKey) {
-      return ((AspectKey) key).prettyPrint();
+    if (key instanceof ConfiguredTargetKey configuredTargetKey) {
+      return configuredTargetKey.prettyPrint();
+    } else if (key instanceof AspectKey aspectKey) {
+      return aspectKey.prettyPrint();
     } else {
       return getLabel((SkyKey) key).toString();
     }
@@ -78,8 +78,8 @@
   public Label getLabel(SkyKey key) {
     if (key instanceof ActionLookupKey) {
       return Preconditions.checkNotNull(((ActionLookupKey) key.argument()).getLabel(), key);
-    } else if (key instanceof TransitiveTargetKey) {
-      return ((TransitiveTargetKey) key).getLabel();
+    } else if (key instanceof TransitiveTargetKey transitiveTargetKey) {
+      return transitiveTargetKey.getLabel();
     } else {
       throw new UnsupportedOperationException(key.toString());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
index 08eb8185..51af232 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternFunction.java
@@ -81,11 +81,8 @@
               //  won't be listed when doing somepackage:* for the handful of cases still on the
               //  allowlist. This is only a Google-internal problem and the scale of it is
               //  acceptable in the short term while cleaning up the allowlist.
-              if (target instanceof OutputFile
-                  && ((OutputFile) target)
-                      .getGeneratingRule()
-                      .getRuleClass()
-                      .equals("cc_library")) {
+              if (target instanceof OutputFile outputFile
+                  && outputFile.getGeneratingRule().getRuleClass().equals("cc_library")) {
                 continue;
               }
               resolvedTargetsBuilder.add(target);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
index 73b533d..6d7ac1f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -77,8 +77,8 @@
         }
 
         AdvertisedProviderSet providers =
-            target instanceof Rule
-                ? ((Rule) target).getRuleClassObject().getAdvertisedProviders()
+            target instanceof Rule rule
+                ? rule.getRuleClassObject().getAdvertisedProviders()
                 : AdvertisedProviderSet.EMPTY;
 
         value = new TransitiveTraversalValueWithoutError(providers, target.getTargetKind());
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 07c6949..2eaf03d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -448,8 +448,8 @@
         return new StarlarkModuleLoadingException("Cycle encountered while loading " + label);
       }
       Throwable e = Preconditions.checkNotNull(error.getException());
-      if (e instanceof BzlLoadFailedException) {
-        return new StarlarkModuleLoadingException((BzlLoadFailedException) e);
+      if (e instanceof BzlLoadFailedException bzlLoadFailedException) {
+        return new StarlarkModuleLoadingException(bzlLoadFailedException);
       }
       throw new IllegalStateException(
           "Unexpected Exception type from BzlLoadValue for " + label + " with error: " + error, e);
@@ -482,8 +482,8 @@
           pkgId, "Cycle encountered while loading package " + pkgId);
     }
     Throwable e = Preconditions.checkNotNull(error.getException());
-    if (e instanceof NoSuchPackageException) {
-      return (NoSuchPackageException) e;
+    if (e instanceof NoSuchPackageException noSuchPackageException) {
+      return noSuchPackageException;
     }
     throw new IllegalStateException(
         "Unexpected Exception type from PackageValue for '" + pkgId + "'' with error: " + error, e);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java
index d4932b2..db7094d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java
@@ -440,8 +440,8 @@
         }
       }
 
-      if (lostInput instanceof Artifact
-          && failedActionDeps.contains(Artifact.key((Artifact) lostInput))) {
+      if (lostInput instanceof Artifact artifact
+          && failedActionDeps.contains(Artifact.key(artifact))) {
         checkDerived((Artifact) lostInput);
 
         lostInputOwningDirectDeps.add((DerivedArtifact) lostInput);
@@ -548,10 +548,10 @@
     for (EndpointPair<SkyKey> edge : edges) {
       SkyKey target = edge.target();
       if (target instanceof Artifact && rewindGraph.addNode(target)) {
-        newlyVisitedArtifacts.add(((DerivedArtifact) target));
+        newlyVisitedArtifacts.add((DerivedArtifact) target);
       }
       if (target instanceof ActionLookupData && rewindGraph.addNode(target)) {
-        newlyVisitedActions.add(((ActionLookupData) target));
+        newlyVisitedActions.add((ActionLookupData) target);
       }
       rewindGraph.putEdge(edge.source(), edge.target());
     }
@@ -584,8 +584,8 @@
       if (newlyVisited) {
         if (artifactKey instanceof Artifact) {
           newlyVisitedArtifacts.add((DerivedArtifact) artifactKey);
-        } else if (artifactKey instanceof ActionLookupData) {
-          newlyVisitedActions.add((ActionLookupData) artifactKey);
+        } else if (artifactKey instanceof ActionLookupData actionLookupData) {
+          newlyVisitedActions.add(actionLookupData);
         }
       }
       rewindGraph.putEdge(actionKey, artifactKey);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/RegisteredToolchainsCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/RegisteredToolchainsCycleReporter.java
index 05fca20..4d249e0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/RegisteredToolchainsCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/RegisteredToolchainsCycleReporter.java
@@ -79,8 +79,8 @@
 
     Function<Object, String> printer =
         input -> {
-          if (input instanceof ConfiguredTargetKey) {
-            Label label = ((ConfiguredTargetKey) input).getLabel();
+          if (input instanceof ConfiguredTargetKey ctk) {
+            Label label = ctk.getLabel();
             return label.toString();
           }
           if (input instanceof RegisteredToolchainsValue.Key) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainException.java b/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainException.java
index f74a40f..cafc4d8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainException.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/toolchains/ToolchainException.java
@@ -71,8 +71,8 @@
     for (Throwable cause = getCause();
         cause != null && cause != cause.getCause();
         cause = cause.getCause()) {
-      if (cause instanceof ConfiguredValueCreationException) {
-        return (ConfiguredValueCreationException) cause;
+      if (cause instanceof ConfiguredValueCreationException configuredValueCreationException) {
+        return configuredValueCreationException;
       }
     }
     Cause cause =
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
index 4e669e6..eb1ab85 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkdebug/server/DebuggerSerialization.java
@@ -46,21 +46,21 @@
   }
 
   private static String getDescription(Object value) {
-    if (value instanceof String) {
-      return (String) value;
+    if (value instanceof String string) {
+      return string;
     }
     return Starlark.repr(value);
   }
 
   private static boolean hasChildren(Object value) {
-    if (value instanceof Map) {
-      return !((Map) value).isEmpty();
+    if (value instanceof Map<?, ?> map) {
+      return !map.isEmpty();
     }
     if (value instanceof Map.Entry) {
       return true;
     }
-    if (value instanceof Iterable) {
-      return ((Iterable) value).iterator().hasNext();
+    if (value instanceof Iterable<?> iterable) {
+      return iterable.iterator().hasNext();
     }
     if (value.getClass().isArray()) {
       return Array.getLength(value) > 0;
@@ -81,14 +81,14 @@
   }
 
   static ImmutableList<Value> getChildren(ThreadObjectMap objectMap, Object value) {
-    if (value instanceof Map) {
-      return getChildren(objectMap, ((Map) value).entrySet());
+    if (value instanceof Map<?, ?> map) {
+      return getChildren(objectMap, map.entrySet());
     }
-    if (value instanceof Map.Entry) {
-      return getChildren(objectMap, (Map.Entry) value);
+    if (value instanceof Map.Entry<?, ?> mapEntry) {
+      return getChildren(objectMap, mapEntry);
     }
-    if (value instanceof Iterable) {
-      return getChildren(objectMap, (Iterable) value);
+    if (value instanceof Iterable<?> iterable) {
+      return getChildren(objectMap, iterable);
     }
     if (value.getClass().isArray()) {
       return getArrayChildren(objectMap, value);
@@ -97,11 +97,11 @@
       return getDebugAttributes(objectMap, (Debug.ValueWithDebugAttributes) value);
     }
     // TODO(bazel-team): move child-listing logic to StarlarkValue where practical
-    if (value instanceof Structure) {
-      return getChildren(objectMap, (Structure) value);
+    if (value instanceof Structure structure) {
+      return getChildren(objectMap, structure);
     }
-    if (value instanceof StarlarkValue) {
-      return getChildren(objectMap, (StarlarkValue) value);
+    if (value instanceof StarlarkValue starlarkValue) {
+      return getChildren(objectMap, starlarkValue);
     }
     // fallback to assuming there are no children
     return ImmutableList.of();
diff --git a/src/main/java/com/google/devtools/build/lib/util/CommandUtils.java b/src/main/java/com/google/devtools/build/lib/util/CommandUtils.java
index c792d21..973919d 100644
--- a/src/main/java/com/google/devtools/build/lib/util/CommandUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/util/CommandUtils.java
@@ -44,8 +44,8 @@
         CommandFailureUtils.describeCommandFailure(verbose, cwd(command), command)
             + ": "
             + exception.getMessage();
-    if (exception instanceof AbnormalTerminationException) {
-      CommandResult result = ((AbnormalTerminationException) exception).getResult();
+    if (exception instanceof AbnormalTerminationException abnormalTerminationException) {
+      CommandResult result = abnormalTerminationException.getResult();
       try {
         return message + "\n"
             + new String(result.getStdout())
diff --git a/src/main/java/com/google/devtools/build/lib/util/DependencySet.java b/src/main/java/com/google/devtools/build/lib/util/DependencySet.java
index 031eb1a..88dfa36 100644
--- a/src/main/java/com/google/devtools/build/lib/util/DependencySet.java
+++ b/src/main/java/com/google/devtools/build/lib/util/DependencySet.java
@@ -239,8 +239,8 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof DependencySet
-        && ((DependencySet) other).dependencies.equals(dependencies);
+    return other instanceof DependencySet dependencySet
+        && dependencySet.dependencies.equals(dependencies);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/util/FileType.java b/src/main/java/com/google/devtools/build/lib/util/FileType.java
index af9f86f..39873a7 100644
--- a/src/main/java/com/google/devtools/build/lib/util/FileType.java
+++ b/src/main/java/com/google/devtools/build/lib/util/FileType.java
@@ -102,8 +102,8 @@
 
     @Override
     public boolean equals(Object obj) {
-      return (obj instanceof ListFileType
-          && this.extensions.equals(((ListFileType) obj).extensions));
+      return obj instanceof ListFileType listFileType
+          && this.extensions.equals(listFileType.extensions);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java b/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
index dcba28b..f297824 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
@@ -25,8 +25,8 @@
   public static FileStatusWithDigest maybeAdapt(@Nullable FileStatus stat) {
     return stat == null
         ? null
-        : (stat instanceof FileStatusWithDigest)
-            ? (FileStatusWithDigest) stat
+        : stat instanceof FileStatusWithDigest fileStatusWithDigest
+            ? fileStatusWithDigest
             : new FileStatusWithDigestAdapter(stat);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/IORuntimeException.java b/src/main/java/com/google/devtools/build/lib/vfs/IORuntimeException.java
index ef78e34..c142faa 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/IORuntimeException.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/IORuntimeException.java
@@ -69,8 +69,8 @@
   @Nullable
   public IOException getCauseIOException() {
     Throwable cause = getCause();
-    if (cause instanceof IOException) {
-      return (IOException) cause;
+    if (cause instanceof IOException ioException) {
+      return ioException;
     } else {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index 02fabc1..6e567c1 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -458,8 +458,8 @@
       // bound to global variables take on the name of the global variable.
       thread.setPostAssignHook(
           (name, value) -> {
-            if (value instanceof FakeProviderApi) {
-              ((FakeProviderApi) value).setName(name);
+            if (value instanceof FakeProviderApi fakeProviderApi) {
+              fakeProviderApi.setName(name);
             }
           });
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
index fa4224f..b158459 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkAttrModuleApi.java
@@ -271,8 +271,8 @@
 
     // Generic fake provider? (e.g. Starlark-defined, or trivial fake)
     // Return name set at construction, or by "export" operation, if any.
-    if (provider instanceof FakeProviderApi) {
-      return ((FakeProviderApi) provider).getName(); // may be "Unexported Provider"
+    if (provider instanceof FakeProviderApi fakeProviderApi) {
+      return fakeProviderApi.getName(); // may be "Unexported Provider"
     }
 
     // Specialized fake provider? (e.g. DefaultInfo)
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
index 4294852..04bb871 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkRuleFunctionsApi.java
@@ -192,8 +192,8 @@
 
   @Override
   public Label label(Object input, StarlarkThread thread) throws EvalException {
-    if (input instanceof Label) {
-      return (Label) input;
+    if (input instanceof Label label) {
+      return label;
     }
     try {
       return Label.parseCanonical((String) input);
diff --git a/src/main/java/com/google/devtools/build/skydoc/rendering/LabelRenderer.java b/src/main/java/com/google/devtools/build/skydoc/rendering/LabelRenderer.java
index 19a57e9..0765cc3 100644
--- a/src/main/java/com/google/devtools/build/skydoc/rendering/LabelRenderer.java
+++ b/src/main/java/com/google/devtools/build/skydoc/rendering/LabelRenderer.java
@@ -79,8 +79,8 @@
     return new Printer() {
       @Override
       public Printer repr(Object o) {
-        if (o instanceof Label) {
-          return repr(render((Label) o));
+        if (o instanceof Label label) {
+          return repr(render(label));
         } else {
           return super.repr(o);
         }
diff --git a/src/main/java/com/google/devtools/build/skyframe/GroupedDeps.java b/src/main/java/com/google/devtools/build/skyframe/GroupedDeps.java
index e62875e..0b853b0 100644
--- a/src/main/java/com/google/devtools/build/skyframe/GroupedDeps.java
+++ b/src/main/java/com/google/devtools/build/skyframe/GroupedDeps.java
@@ -228,8 +228,8 @@
   public List<SkyKey> getDepGroup(int i) {
     int index = i == 0 ? 0 : groupIndices.get(i - 1);
     Object obj = elements.get(index);
-    if (obj instanceof SkyKey) {
-      return ImmutableList.of((SkyKey) obj);
+    if (obj instanceof SkyKey skyKey) {
+      return ImmutableList.of(skyKey);
     }
     int groupSize = (int) obj;
     List<?> slice = elements.subList(index + 1, index + 1 + groupSize);
@@ -359,8 +359,8 @@
   public ImmutableSet<SkyKey> toSet() {
     ImmutableSet.Builder<SkyKey> builder = ImmutableSet.builderWithExpectedSize(size);
     for (Object obj : elements) {
-      if (obj instanceof SkyKey) {
-        builder.add((SkyKey) obj);
+      if (obj instanceof SkyKey skyKey) {
+        builder.add(skyKey);
       }
     }
     return builder.build();
diff --git a/src/main/java/com/google/devtools/build/skyframe/KeyToConsolidate.java b/src/main/java/com/google/devtools/build/skyframe/KeyToConsolidate.java
index 063b50a..0d61ec9 100644
--- a/src/main/java/com/google/devtools/build/skyframe/KeyToConsolidate.java
+++ b/src/main/java/com/google/devtools/build/skyframe/KeyToConsolidate.java
@@ -91,8 +91,8 @@
 
   /** Gets the key whose operation was delayed for the given object. */
   static SkyKey key(Object obj) {
-    if (obj instanceof SkyKey) {
-      return (SkyKey) obj;
+    if (obj instanceof SkyKey skyKey) {
+      return skyKey;
     }
     Preconditions.checkState(obj instanceof KeyToConsolidate, obj);
     return ((KeyToConsolidate) obj).key;
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
index 414811a..dd2b86b 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -699,12 +699,12 @@
 
     // Otherwise, there's an error.
     @Nullable Object result = handleError(depKey, wrappedValue);
-    if (result instanceof SkyValue) {
-      resultCallback.acceptValue(depKey, (SkyValue) result);
+    if (result instanceof SkyValue skyValue) {
+      resultCallback.acceptValue(depKey, skyValue);
       return true;
     }
-    if (result instanceof Exception
-        && resultCallback.tryHandleException(depKey, (Exception) result)) {
+    if (result instanceof Exception exception
+        && resultCallback.tryHandleException(depKey, exception)) {
       return true;
     }
     valuesMissing = true;
@@ -740,8 +740,8 @@
 
     // Otherwise, there's an error.
     @Nullable Object result = handleError(depKey, wrappedValue);
-    if (result instanceof SkyValue) {
-      return (SkyValue) result;
+    if (result instanceof SkyValue skyValue) {
+      return skyValue;
     }
     if (result instanceof Exception) {
       SkyFunctionException.throwIfInstanceOf(
diff --git a/src/main/java/com/google/devtools/build/skyframe/ValueWithMetadata.java b/src/main/java/com/google/devtools/build/skyframe/ValueWithMetadata.java
index d65aa84..754f8bb 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ValueWithMetadata.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ValueWithMetadata.java
@@ -223,15 +223,15 @@
 
   @Nullable
   public static SkyValue justValue(SkyValue value) {
-    if (value instanceof ValueWithMetadata) {
-      return ((ValueWithMetadata) value).value;
+    if (value instanceof ValueWithMetadata valueWithMetadata) {
+      return valueWithMetadata.value;
     }
     return value;
   }
 
   public static ValueWithMetadata wrapWithMetadata(SkyValue value) {
-    if (value instanceof ValueWithMetadata) {
-      return (ValueWithMetadata) value;
+    if (value instanceof ValueWithMetadata valueWithMetadata) {
+      return valueWithMetadata;
     }
     return ValueWithEvents.createValueWithEvents(value, NO_EVENTS);
   }
@@ -245,8 +245,8 @@
   }
 
   public static NestedSet<Reportable> getEvents(SkyValue value) {
-    if (value instanceof ValueWithMetadata) {
-      return ((ValueWithMetadata) value).getTransitiveEvents();
+    if (value instanceof ValueWithMetadata valueWithMetadata) {
+      return valueWithMetadata.getTransitiveEvents();
     }
     return NO_EVENTS;
   }
diff --git a/src/main/java/com/google/devtools/build/skyframe/state/EnvironmentForUtilities.java b/src/main/java/com/google/devtools/build/skyframe/state/EnvironmentForUtilities.java
index 6955796..b7b268c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/state/EnvironmentForUtilities.java
+++ b/src/main/java/com/google/devtools/build/skyframe/state/EnvironmentForUtilities.java
@@ -90,8 +90,8 @@
     if (result == null) {
       return null;
     }
-    if (result instanceof SkyValue) {
-      return (SkyValue) result;
+    if (result instanceof SkyValue skyValue) {
+      return skyValue;
     }
     if (exceptionClass1 != null && exceptionClass1.isInstance(result)) {
       throw exceptionClass1.cast(result);
@@ -136,8 +136,8 @@
     if (result == null) {
       return false;
     }
-    if (result instanceof SkyValue) {
-      resultCallback.acceptValue(key, (SkyValue) result);
+    if (result instanceof SkyValue skyValue) {
+      resultCallback.acceptValue(key, skyValue);
       return true;
     }
     if (resultCallback.tryHandleException(key, (Exception) result)) {
diff --git a/src/main/java/com/google/devtools/build/skyframe/state/Lookup.java b/src/main/java/com/google/devtools/build/skyframe/state/Lookup.java
index 77682f3..2925e52 100644
--- a/src/main/java/com/google/devtools/build/skyframe/state/Lookup.java
+++ b/src/main/java/com/google/devtools/build/skyframe/state/Lookup.java
@@ -120,8 +120,8 @@
         }
         acceptValue(key, value);
       } catch (Exception e) {
-        if (e instanceof InterruptedException) {
-          throw (InterruptedException) e;
+        if (e instanceof InterruptedException interruptedException) {
+          throw interruptedException;
         }
         if (!tryHandleException(key, e)) {
           throw new IllegalArgumentException("Unexpected exception for " + key(), e);
@@ -172,8 +172,8 @@
         }
         acceptValue(key, value);
       } catch (Exception e) {
-        if (e instanceof InterruptedException) {
-          throw (InterruptedException) e;
+        if (e instanceof InterruptedException interruptedException) {
+          throw interruptedException;
         }
         if (!tryHandleException(key, e)) {
           throw new IllegalArgumentException("Unexpected exception for " + key(), e);
@@ -235,8 +235,8 @@
         }
         acceptValue(key, value);
       } catch (Exception e) {
-        if (e instanceof InterruptedException) {
-          throw (InterruptedException) e;
+        if (e instanceof InterruptedException interruptedException) {
+          throw interruptedException;
         }
         if (!tryHandleException(key, e)) {
           throw new IllegalArgumentException("Unexpected exception for " + key(), e);
diff --git a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
index 88b0730..c9667f4 100644
--- a/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
+++ b/src/main/java/com/google/devtools/common/options/testing/ConverterTester.java
@@ -194,8 +194,8 @@
 
     @Override
     public boolean equals(Object other) {
-      if (other instanceof WrappedItem) {
-        return this.wrapped.equals(((WrappedItem) other).wrapped);
+      if (other instanceof WrappedItem wrappedItem) {
+        return this.wrapped.equals(wrappedItem.wrapped);
       }
       return this.wrapped.equals(other);
     }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/InjectedActionLookupKey.java b/src/test/java/com/google/devtools/build/lib/actions/util/InjectedActionLookupKey.java
index 49f88ae..1980b44 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/util/InjectedActionLookupKey.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/util/InjectedActionLookupKey.java
@@ -58,8 +58,8 @@
 
   @Override
   public boolean equals(Object obj) {
-    return obj instanceof InjectedActionLookupKey
-        && ((InjectedActionLookupKey) obj).name.equals(name);
+    return obj instanceof InjectedActionLookupKey injectedActionLookupKey
+        && injectedActionLookupKey.name.equals(name);
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 8b26fd0..0be257e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -847,8 +847,8 @@
   /** Locates the first parameter file used by the action and returns its command line. */
   @Nullable
   protected final CommandLine paramFileCommandLineForAction(Action action) {
-    if (action instanceof SpawnAction) {
-      CommandLines commandLines = ((SpawnAction) action).getCommandLines();
+    if (action instanceof SpawnAction spawnAction) {
+      CommandLines commandLines = spawnAction.getCommandLines();
       for (CommandLineAndParamFileInfo pair : commandLines.unpack()) {
         if (pair.paramFileInfo != null) {
           return pair.commandLine;
@@ -883,8 +883,8 @@
   @Nullable
   protected final String paramFileStringContentsForAction(Action action)
       throws CommandLineExpansionException, InterruptedException, IOException {
-    if (action instanceof SpawnAction) {
-      CommandLines commandLines = ((SpawnAction) action).getCommandLines();
+    if (action instanceof SpawnAction spawnAction) {
+      CommandLines commandLines = spawnAction.getCommandLines();
       for (CommandLineAndParamFileInfo pair : commandLines.unpack()) {
         if (pair.paramFileInfo != null) {
           ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -906,8 +906,8 @@
     for (Artifact input : action.getInputs().toList()) {
       if (!(input instanceof SpecialArtifact)) {
         Action generatingAction = getGeneratingAction(input);
-        if (generatingAction instanceof ParameterFileWriteAction) {
-          return (ParameterFileWriteAction) generatingAction;
+        if (generatingAction instanceof ParameterFileWriteAction parameterFileWriteAction) {
+          return parameterFileWriteAction;
         }
       }
     }
@@ -1094,8 +1094,8 @@
    */
   protected Artifact getArtifact(String label) throws LabelSyntaxException {
     ConfiguredTarget target = getConfiguredTarget(label, targetConfig);
-    if (target instanceof FileConfiguredTarget) {
-      return ((FileConfiguredTarget) target).getArtifact();
+    if (target instanceof FileConfiguredTarget fileConfiguredTarget) {
+      return fileConfiguredTarget.getArtifact();
     } else {
       return getFilesToBuild(target).getSingleton();
     }
@@ -1410,8 +1410,8 @@
       } catch (InterruptedException e) {
         throw new IllegalStateException(e);
       }
-      if (skyValue instanceof ActionLookupValue) {
-        for (ActionAnalysisMetadata action : ((ActionLookupValue) skyValue).getActions()) {
+      if (skyValue instanceof ActionLookupValue actionLookupValue) {
+        for (ActionAnalysisMetadata action : actionLookupValue.getActions()) {
           for (Artifact output : action.getOutputs()) {
             if (output.getRootRelativePath().equals(rootRelativePath)
                 && output.getRoot().equals(root)) {
@@ -2257,8 +2257,8 @@
     ExtraAction extraAction = null;
 
     for (Action action : actions) {
-      if (action instanceof ExtraAction) {
-        extraAction = (ExtraAction) action;
+      if (action instanceof ExtraAction loopAction) {
+        extraAction = loopAction;
         break;
       }
     }
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/FakeRegistry.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/FakeRegistry.java
index b48529a..10500fb 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/FakeRegistry.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/FakeRegistry.java
@@ -93,9 +93,9 @@
 
   @Override
   public boolean equals(Object other) {
-    return other instanceof FakeRegistry
-        && this.url.equals(((FakeRegistry) other).url)
-        && this.modules.equals(((FakeRegistry) other).modules);
+    return other instanceof FakeRegistry fakeRegistry
+        && this.url.equals(fakeRegistry.url)
+        && this.modules.equals(fakeRegistry.modules);
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/bugreport/BugReportTest.java b/src/test/java/com/google/devtools/build/lib/bugreport/BugReportTest.java
index 40d3dc7..8afa082 100644
--- a/src/test/java/com/google/devtools/build/lib/bugreport/BugReportTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bugreport/BugReportTest.java
@@ -231,8 +231,8 @@
         createExpectedFailureDetail(t, crashType, oomDetectorOverride);
     // TODO(b/222158599): This should always be ExitException.
     SecurityException e = assertThrows(SecurityException.class, () -> BugReport.handleCrash(t));
-    if (e instanceof ExitException) {
-      int code = ((ExitException) e).code;
+    if (e instanceof ExitException exitException) {
+      int code = exitException.code;
       assertThat(code).isEqualTo(crashType.expectedExitCode.getNumericExitCode());
     }
     assertThat(BugReport.getAndResetLastCrashingThrowableIfInTest()).isSameInstanceAs(t);
@@ -260,8 +260,8 @@
         assertThrows(
             SecurityException.class,
             () -> BugReport.handleCrash(Crash.from(t), CrashContext.halt()));
-    if (e instanceof ExitException) {
-      int code = ((ExitException) e).code;
+    if (e instanceof ExitException exitException) {
+      int code = exitException.code;
       assertThat(code).isEqualTo(crashType.expectedExitCode.getNumericExitCode());
     }
     assertThat(BugReport.getAndResetLastCrashingThrowableIfInTest()).isSameInstanceAs(t);
@@ -340,14 +340,14 @@
 
     // TODO(b/222158599): These should always be ExitException.
     SecurityException firstException = firstCrashThrownRef.get();
-    if (firstException instanceof ExitException) {
-      int code = ((ExitException) firstException).code;
+    if (firstException instanceof ExitException exitException) {
+      int code = exitException.code;
       assertThat(code).isEqualTo(ExitCode.BLAZE_INTERNAL_ERROR.getNumericExitCode());
     }
 
     SecurityException secondException = assertThrows(SecurityException.class, doSecondCrash);
-    if (secondException instanceof ExitException) {
-      int code = ((ExitException) secondException).code;
+    if (secondException instanceof ExitException exitException) {
+      int code = exitException.code;
       assertThat(code).isEqualTo(crashType.expectedExitCode.getNumericExitCode());
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/cmdline/LabelInternerIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/cmdline/LabelInternerIntegrationTest.java
index eaee62d..0f1c819 100644
--- a/src/test/java/com/google/devtools/build/lib/cmdline/LabelInternerIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/cmdline/LabelInternerIntegrationTest.java
@@ -94,8 +94,8 @@
         .forEach(
             t -> {
               allPackageTargetsLabelInstances.add(t.getLabel());
-              if (t instanceof Rule) {
-                allRuleDepLabelInstances.addAll(((Rule) t).getLabels());
+              if (t instanceof Rule rule) {
+                allRuleDepLabelInstances.addAll(rule.getLabels());
               }
             });
 
diff --git a/src/test/java/com/google/devtools/build/lib/concurrent/PooledInternerTest.java b/src/test/java/com/google/devtools/build/lib/concurrent/PooledInternerTest.java
index fa8db16..33d3918 100644
--- a/src/test/java/com/google/devtools/build/lib/concurrent/PooledInternerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/concurrent/PooledInternerTest.java
@@ -138,8 +138,8 @@
 
     @Override
     public boolean equals(Object obj) {
-      return obj instanceof ObjectForInternerTests
-          && arg.equals(((ObjectForInternerTests) obj).arg);
+      return obj instanceof ObjectForInternerTests objectForInternerTests
+          && arg.equals(objectForInternerTests.arg);
     }
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
index c284a5c..6d10dee 100644
--- a/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/profiler/memory/AllocationTrackerTest.java
@@ -65,8 +65,8 @@
   private class SamplerValue implements HasBinary {
     @Override
     public Object binaryOp(TokenKind op, Object that, boolean thisLeft) throws EvalException {
-      if (op == TokenKind.PLUS && thisLeft && that instanceof StarlarkInt) {
-        int size = ((StarlarkInt) that).toIntUnchecked(); // test values are small
+      if (op == TokenKind.PLUS && thisLeft && that instanceof StarlarkInt starlarkInt) {
+        int size = starlarkInt.toIntUnchecked(); // test values are small
         Object obj = new Object();
         live.add(obj); // ensure that obj outlives the test assertions
         tracker.sampleAllocation(1, "", obj, size);
diff --git a/src/test/java/com/google/devtools/build/lib/remote/BuildWithoutTheBytesIntegrationTestBase.java b/src/test/java/com/google/devtools/build/lib/remote/BuildWithoutTheBytesIntegrationTestBase.java
index 1e9bcf0..f3e7350 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/BuildWithoutTheBytesIntegrationTestBase.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/BuildWithoutTheBytesIntegrationTestBase.java
@@ -1324,10 +1324,10 @@
     var evaluator = getRuntimeWrapper().getSkyframeExecutor().getEvaluator();
     for (var artifact : getArtifacts(target)) {
       var value = evaluator.getExistingValue(Artifact.key(artifact));
-      if (value instanceof ActionExecutionValue) {
-        result.putAll(((ActionExecutionValue) value).getAllFileValues());
-      } else if (value instanceof TreeArtifactValue) {
-        result.putAll(((TreeArtifactValue) value).getChildValues());
+      if (value instanceof ActionExecutionValue actionExecutionValue) {
+        result.putAll(actionExecutionValue.getAllFileValues());
+      } else if (value instanceof TreeArtifactValue treeArtifactValue) {
+        result.putAll(treeArtifactValue.getChildValues());
       }
     }
     return result.buildOrThrow();
@@ -1336,10 +1336,10 @@
   protected FileArtifactValue getMetadata(Artifact output) throws Exception {
     var evaluator = getRuntimeWrapper().getSkyframeExecutor().getEvaluator();
     var value = evaluator.getExistingValue(Artifact.key(output));
-    if (value instanceof ActionExecutionValue) {
-      return ((ActionExecutionValue) value).getAllFileValues().get(output);
-    } else if (value instanceof TreeArtifactValue) {
-      return ((TreeArtifactValue) value).getChildValues().get(output);
+    if (value instanceof ActionExecutionValue actionExecutionValue) {
+      return actionExecutionValue.getAllFileValues().get(output);
+    } else if (value instanceof TreeArtifactValue treeArtifactValue) {
+      return treeArtifactValue.getChildValues().get(output);
     }
     return null;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/remote/FakeImmutableCacheByteStreamImpl.java b/src/test/java/com/google/devtools/build/lib/remote/FakeImmutableCacheByteStreamImpl.java
index 30e7033..e398abb 100644
--- a/src/test/java/com/google/devtools/build/lib/remote/FakeImmutableCacheByteStreamImpl.java
+++ b/src/test/java/com/google/devtools/build/lib/remote/FakeImmutableCacheByteStreamImpl.java
@@ -37,10 +37,10 @@
     for (Map.Entry<Digest, Object> e : contents.entrySet()) {
       Object obj = e.getValue();
       ByteString data;
-      if (obj instanceof String) {
-        data = ByteString.copyFromUtf8((String) obj);
-      } else if (obj instanceof ByteString) {
-        data = (ByteString) obj;
+      if (obj instanceof String string) {
+        data = ByteString.copyFromUtf8(string);
+      } else if (obj instanceof ByteString byteString) {
+        data = byteString;
       } else {
         throw new AssertionError(
             "expected object to be either a String or a ByteString, got a "
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
index d3d8d63..d1592ca 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidResourcesTest.java
@@ -168,7 +168,7 @@
     if (maybeFiltered.isPresent()) {
       AndroidResources filtered = maybeFiltered.get();
       assertThat(filtered instanceof ValidatedAndroidResources).isTrue();
-      ValidatedAndroidResources validated = (ValidatedAndroidResources) filtered;
+      ValidatedAndroidResources validated = ((ValidatedAndroidResources) filtered);
 
       // Validate fields related to validation are unchanged
       assertThat(validated.getRTxt()).isEqualTo(unfiltered.getRTxt());
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoRoundtripTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoRoundtripTest.java
index d949c5f..0edc7aa 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoRoundtripTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoRoundtripTest.java
@@ -155,8 +155,8 @@
         builder.add(deepStripAttributes(item, shouldRemove));
       }
       return (T) StarlarkList.immutableCopyOf(builder.build());
-    } else if (obj instanceof Structure) {
-      for (String fieldName : ((Structure) obj).getFieldNames()) {
+    } else if (obj instanceof Structure structure) {
+      for (String fieldName : structure.getFieldNames()) {
         Dict.Builder<String, Object> builder = Dict.builder();
         if (!shouldRemove.test(fieldName)) {
           builder.put(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
index 1d65458..706f058 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
@@ -816,8 +816,8 @@
       if (!(input instanceof SpecialArtifact)) {
         if (input.getFilename().endsWith("linker.objlist")) {
           Action generatingAction = getGeneratingAction(input);
-          if (generatingAction instanceof ParameterFileWriteAction) {
-            return (ParameterFileWriteAction) generatingAction;
+          if (generatingAction instanceof ParameterFileWriteAction parameterFileWriteAction) {
+            return parameterFileWriteAction;
           }
         }
       }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index 59a93e3..db6bdd6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -417,8 +417,8 @@
       throw result.getError().getException();
     }
     SkyValue value = result.get(key);
-    if (value instanceof ActionExecutionValue) {
-      return ((ActionExecutionValue) value).getExistingFileArtifactValue(artifact);
+    if (value instanceof ActionExecutionValue actionExecutionValue) {
+      return actionExecutionValue.getExistingFileArtifactValue(artifact);
     }
     return value;
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index d846395..4066694 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -1660,8 +1660,8 @@
             NotifyingHelper.makeNotifyingTransformer(
                 (key, type, order, context) -> {
                   if (EventType.IS_READY.equals(type)
-                      && key instanceof ActionLookupData
-                      && lc1.equals(((ActionLookupData) key).getActionLookupKey())) {
+                      && key instanceof ActionLookupData actionLookupData
+                      && lc1.equals(actionLookupData.getActionLookupKey())) {
                     TrackingAwaiter.INSTANCE.awaitLatchAndTrackExceptions(startedSleep, "No sleep");
                   }
                 }));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
index 0966d91..38ab719 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
@@ -94,9 +94,9 @@
 
       @Override
       public boolean equals(Object obj) {
-        return obj instanceof InvalidatedKey
-            && this.skyKey.equals(((InvalidatedKey) obj).skyKey)
-            && this.state.equals(((InvalidatedKey) obj).state);
+        return obj instanceof InvalidatedKey invalidatedKey
+            && this.skyKey.equals(invalidatedKey.skyKey)
+            && this.state.equals(invalidatedKey.state);
       }
 
       @Override
@@ -116,9 +116,9 @@
 
       @Override
       public boolean equals(Object obj) {
-        return obj instanceof EvaluatedEntry
-            && this.skyKey.equals(((EvaluatedEntry) obj).skyKey)
-            && this.state.equals(((EvaluatedEntry) obj).state);
+        return obj instanceof EvaluatedEntry evaluatedEntry
+            && this.skyKey.equals(evaluatedEntry.skyKey)
+            && this.state.equals(evaluatedEntry.state);
       }
 
       @Override
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/rewinding/RewindingTestsHelper.java b/src/test/java/com/google/devtools/build/lib/skyframe/rewinding/RewindingTestsHelper.java
index 6c89d1c..1705788 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/rewinding/RewindingTestsHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/rewinding/RewindingTestsHelper.java
@@ -1373,8 +1373,8 @@
           }
 
           if (type.equals(EventType.IS_READY)
-              && key instanceof ActionLookupData
-              && actionHasLabelAndIndex((ActionLookupData) key, "shared_2", 0)) {
+              && key instanceof ActionLookupData actionLookupData
+              && actionHasLabelAndIndex(actionLookupData, "shared_2", 0)) {
             int shared2AReadiedCount = shared2AReady.incrementAndGet();
             if (shared2AReadiedCount == 1) {
               awaitUninterruptibly(shared1BEmittedRewoundEvent);
@@ -1382,8 +1382,8 @@
           }
 
           if (type.equals(EventType.IS_READY)
-              && key instanceof ActionLookupData
-              && actionHasLabelAndIndex((ActionLookupData) key, "shared_2", 1)) {
+              && key instanceof ActionLookupData actionLookupData
+              && actionHasLabelAndIndex(actionLookupData, "shared_2", 1)) {
             int shared2BReadiedCount = shared2BReady.incrementAndGet();
             if (shared2BReadiedCount == 5) {
               // Wait to attempt final evaluation of shared_2B until after shared_1B is done.
@@ -1395,24 +1395,24 @@
           // When shared_2B declares a future dep, allow shared_1B's Skyframe execution attempt to
           // clear its ActionExecutionState and reset its node.
           if (type.equals(EventType.ADD_EXTERNAL_DEP)
-              && key instanceof ActionLookupData
-              && actionHasLabelAndIndex((ActionLookupData) key, "shared_2", 1)) {
+              && key instanceof ActionLookupData actionLookupData
+              && actionHasLabelAndIndex(actionLookupData, "shared_2", 1)) {
             shared2BDeclaresFutureDep.countDown();
           }
 
           // Wait to attempt the rewound evaluation of shared_1A until after shared_2A finishes its
           // rewound evaluation and shared_2B is ready again.
           if (type.equals(EventType.IS_READY)
-              && key instanceof ActionLookupData
-              && actionHasLabelAndIndex((ActionLookupData) key, "shared_1", 0)) {
+              && key instanceof ActionLookupData actionLookupData
+              && actionHasLabelAndIndex(actionLookupData, "shared_1", 0)) {
             if (shared1ARewound.get() == 1) {
               awaitUninterruptibly(shared2BReadyForFifthTime);
             }
           }
 
           if (type.equals(EventType.SET_VALUE)
-              && key instanceof ActionLookupData
-              && actionHasLabelAndIndex((ActionLookupData) key, "shared_1", 1)) {
+              && key instanceof ActionLookupData actionLookupData
+              && actionHasLabelAndIndex(actionLookupData, "shared_1", 1)) {
             shared1BDone.countDown();
           }
         });
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
index 7c26211..d818784 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkDefinedAspectsTest.java
@@ -9546,8 +9546,8 @@
       Map<AspectKey, ConfiguredAspect> aspectsMap, String aspectName) {
     for (Map.Entry<AspectKey, ConfiguredAspect> entry : aspectsMap.entrySet()) {
       AspectClass aspectClass = entry.getKey().getAspectClass();
-      if (aspectClass instanceof StarlarkAspectClass) {
-        String aspectExportedName = ((StarlarkAspectClass) aspectClass).getExportedName();
+      if (aspectClass instanceof StarlarkAspectClass starlarkAspectClass) {
+        String aspectExportedName = starlarkAspectClass.getExportedName();
         if (aspectExportedName.equals(aspectName)) {
           return entry.getValue();
         }
@@ -9560,8 +9560,8 @@
       Map<AspectKey, ConfiguredAspect> aspectsMap, String aspectName, String targetName) {
     for (Map.Entry<AspectKey, ConfiguredAspect> entry : aspectsMap.entrySet()) {
       AspectClass aspectClass = entry.getKey().getAspectClass();
-      if (aspectClass instanceof StarlarkAspectClass) {
-        String aspectExportedName = ((StarlarkAspectClass) aspectClass).getExportedName();
+      if (aspectClass instanceof StarlarkAspectClass starlarkAspectClass) {
+        String aspectExportedName = starlarkAspectClass.getExportedName();
         String target = entry.getKey().getLabel().getName();
         if (aspectExportedName.equals(aspectName) && target.equals(targetName)) {
           return entry.getValue();
diff --git a/src/test/java/com/google/devtools/build/lib/util/ValueOrExceptionTest.java b/src/test/java/com/google/devtools/build/lib/util/ValueOrExceptionTest.java
index 1786291..b5f1e1c 100644
--- a/src/test/java/com/google/devtools/build/lib/util/ValueOrExceptionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/util/ValueOrExceptionTest.java
@@ -114,8 +114,8 @@
 
     @Override
     public boolean equals(Object o) {
-      if (o instanceof TestValue) {
-        return ((TestValue) o).content == content;
+      if (o instanceof TestValue testValue) {
+        return testValue.content == content;
       } else {
         return false;
       }
@@ -140,8 +140,8 @@
 
     @Override
     public boolean equals(Object o) {
-      if (o instanceof TestException) {
-        return ((TestException) o).getMessage().equals(getMessage());
+      if (o instanceof TestException testException) {
+        return testException.getMessage().equals(getMessage());
       } else {
         return false;
       }
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerFilesHashTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerFilesHashTest.java
index f8c8037..352be40 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerFilesHashTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerFilesHashTest.java
@@ -162,11 +162,11 @@
         if (metadataOrException == null) {
           return null;
         }
-        if (metadataOrException instanceof IOException) {
-          throw (IOException) metadataOrException;
+        if (metadataOrException instanceof IOException ioException) {
+          throw ioException;
         }
-        if (metadataOrException instanceof FileArtifactValue) {
-          return (FileArtifactValue) metadataOrException;
+        if (metadataOrException instanceof FileArtifactValue fileArtifactValue) {
+          return fileArtifactValue;
         }
         throw new AssertionError("Unexpected value: " + metadataOrException);
       }
diff --git a/src/test/java/com/google/devtools/build/skyframe/GraphTester.java b/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
index 3990c53..e5c6ff8 100644
--- a/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
+++ b/src/test/java/com/google/devtools/build/skyframe/GraphTester.java
@@ -223,8 +223,8 @@
                 @Override
                 public boolean tryHandleException(SkyKey key, Exception e) {
                   assertThat(key).isEqualTo(dep.first);
-                  if (e instanceof SomeErrorException) {
-                    exceptionRef.set((SomeErrorException) e);
+                  if (e instanceof SomeErrorException someErrorException) {
+                    exceptionRef.set(someErrorException);
                     return true;
                   }
                   return false;
diff --git a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ExecutionServer.java b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ExecutionServer.java
index aa4f28c..cac99e3 100644
--- a/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ExecutionServer.java
+++ b/src/tools/remote/src/main/java/com/google/devtools/build/remote/worker/ExecutionServer.java
@@ -181,8 +181,8 @@
             }
           } catch (Exception e) {
             ExecuteResponse resp;
-            if (e instanceof ExecutionStatusException) {
-              resp = ((ExecutionStatusException) e).getResponse();
+            if (e instanceof ExecutionStatusException executionStatusException) {
+              resp = executionStatusException.getResponse();
             } else {
               logger.atSevere().withCause(e).log("Work failed: %s", opName);
               resp =
