diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectResolver.java
index f633721..8c57e23 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectResolver.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.util.OrderedSetMultimap;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.ValueOrException2;
+import com.google.devtools.build.skyframe.SkyframeLookupResult;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -60,9 +60,7 @@
       allAspectKeys.addAll(getAspectKeys(dep).values());
     }
 
-    Map<SkyKey, ValueOrException2<AspectCreationException, NoSuchThingException>> depAspects =
-        env.getValuesOrThrow(
-            allAspectKeys, AspectCreationException.class, NoSuchThingException.class);
+    SkyframeLookupResult depAspects = env.getValuesAndExceptions(allAspectKeys);
 
     for (Dependency dep : deps) {
       Map<AspectDescriptor, SkyKey> aspectToKeys = getAspectKeys(dep);
@@ -74,7 +72,10 @@
         try {
           // TODO(ulfjack): Catch all thrown AspectCreationException and NoSuchThingException
           // instances and merge them into a single Exception to get full root cause data.
-          aspectValue = (AspectValue) depAspects.get(aspectKey).get();
+          aspectValue =
+              (AspectValue)
+                  depAspects.getOrThrow(
+                      aspectKey, AspectCreationException.class, NoSuchThingException.class);
         } catch (NoSuchThingException e) {
           throw new AspectCreationException(
               String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 1bb4214..4cc39af 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -87,8 +87,7 @@
 import com.google.devtools.build.skyframe.SkyFunctionException;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
-import com.google.devtools.build.skyframe.ValueOrException2;
-import com.google.devtools.build.skyframe.ValueOrUntypedException;
+import com.google.devtools.build.skyframe.SkyframeLookupResult;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -434,12 +433,7 @@
     if (bzlLoadKey != null) {
       initialKeys.add(bzlLoadKey);
     }
-    Map<SkyKey, ValueOrException2<BzlLoadFailedException, ConfiguredValueCreationException>>
-        initialValues =
-            env.getValuesOrThrow(
-                initialKeys.build(),
-                BzlLoadFailedException.class,
-                ConfiguredValueCreationException.class);
+    SkyframeLookupResult initialValues = env.getValuesAndExceptions(initialKeys.build());
     if (env.valuesMissing()) {
       return null;
     }
@@ -447,9 +441,21 @@
     if (starlarkAspectClass != null) {
       StarlarkDefinedAspect starlarkAspect;
       try {
-        starlarkAspect =
-            Preconditions.checkNotNull(
-                loadStarlarkAspect(starlarkAspectClass, initialValues.get(bzlLoadKey)));
+        BzlLoadValue bzlLoadvalue;
+        try {
+          bzlLoadvalue =
+              (BzlLoadValue) initialValues.getOrThrow(bzlLoadKey, BzlLoadFailedException.class);
+          if (bzlLoadvalue == null) {
+            BugReport.sendBugReport(
+                new IllegalStateException(
+                    "bzlLoadValue " + bzlLoadKey + " was missing, this should never happen"));
+            return null;
+          }
+        } catch (BzlLoadFailedException e) {
+          throw new AspectCreationException(
+              e.getMessage(), starlarkAspectClass.getExtensionLabel(), e.getDetailedExitCode());
+        }
+        starlarkAspect = loadAspectFromBzl(starlarkAspectClass, bzlLoadvalue);
       } catch (AspectCreationException e) {
         env.getListener().handle(Event.error(e.getMessage()));
         throw new AspectFunctionException(e);
@@ -463,7 +469,7 @@
     }
 
     // Keep this in sync with the same code in ConfiguredTargetFunction.
-    PackageValue aspectPackage = (PackageValue) initialValues.get(aspectPackageKey).getUnchecked();
+    PackageValue aspectPackage = (PackageValue) initialValues.get(aspectPackageKey);
     if (aspectPackage.getPackage().containsErrors()) {
       throw new AspectFunctionException(
           new BuildFileContainsErrorsException(key.getLabel().getPackageIdentifier()));
@@ -472,23 +478,21 @@
     ConfiguredTargetValue baseConfiguredTargetValue;
     try {
       baseConfiguredTargetValue =
-          (ConfiguredTargetValue) initialValues.get(baseConfiguredTargetKey).get();
+          (ConfiguredTargetValue)
+              initialValues.getOrThrow(
+                  baseConfiguredTargetKey, ConfiguredValueCreationException.class);
+      if (baseConfiguredTargetValue == null) {
+        BugReport.sendBugReport(
+            new IllegalStateException(
+                "BzlLoadFailedException should have been processed by ConfiguredTargetFunction for "
+                    + baseConfiguredTargetKey
+                    + " and "
+                    + key));
+        return null;
+      }
     } catch (ConfiguredValueCreationException e) {
       throw new AspectFunctionException(
           new AspectCreationException(e.getMessage(), e.getRootCauses(), e.getDetailedExitCode()));
-    } catch (BzlLoadFailedException e) {
-      BugReport.sendBugReport(
-          new IllegalStateException(
-              "BzlLoadFailedException should have been processed by ConfiguredTargetFunction for "
-                  + baseConfiguredTargetKey
-                  + " and "
-                  + key,
-              e));
-      throw new AspectFunctionException(
-          new AspectCreationException(
-              e.getMessage(),
-              NestedSetBuilder.emptySet(Order.STABLE_ORDER),
-              e.getDetailedExitCode()));
     }
 
     ConfiguredTarget associatedTarget = baseConfiguredTargetValue.getConfiguredTarget();
@@ -501,9 +505,9 @@
     BuildConfigurationValue configuration =
         configurationKey == null
             ? null
-            : (BuildConfigurationValue) initialValues.get(configurationKey).getUnchecked();
+            : (BuildConfigurationValue) initialValues.get(configurationKey);
 
-    PackageValue basePackage = (PackageValue) initialValues.get(basePackageKey).getUnchecked();
+    PackageValue basePackage = (PackageValue) initialValues.get(basePackageKey);
     Target target;
     try {
       target = basePackage.getPackage().getTarget(associatedTarget.getOriginalLabel().getName());
@@ -537,24 +541,6 @@
   }
 
   @Nullable
-  private static StarlarkDefinedAspect loadStarlarkAspect(
-      StarlarkAspectClass starlarkAspectClass, ValueOrUntypedException bzlLoadValueOrException)
-      throws AspectCreationException {
-    BzlLoadValue bzlLoadValue;
-    try {
-      bzlLoadValue =
-          (BzlLoadValue) bzlLoadValueOrException.getOrThrow(BzlLoadFailedException.class);
-    } catch (BzlLoadFailedException e) {
-      throw new AspectCreationException(
-          e.getMessage(), starlarkAspectClass.getExtensionLabel(), e.getDetailedExitCode());
-    }
-    if (bzlLoadValue == null) {
-      return null;
-    }
-    return loadAspectFromBzl(starlarkAspectClass, bzlLoadValue);
-  }
-
-  @Nullable
   private static UnloadedToolchainContext getUnloadedToolchainContext(
       Environment env,
       AspectKey key,
