bazel syntax: make @Skylark-annotated classes implement SkylarkValue

This CL adds a check to the @SkylarkCallable annotation processor to require
that all SkylarkModule- or SkylarkGlobalLibary-annotated classes implement
SkylarkValue, thus ensuring that all Starlark values besides str/int/bool
satisfy this interface.

Future changes will add assertions at the public API (e.g. StarlarkList.add)
that Object values conform to this requirement.

All changes except to .../main/.../{skylarkinterface,syntax}/* are mechanical.

PiperOrigin-RevId: 278876512
diff --git a/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java b/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java
index 31aaa63..a876bec 100644
--- a/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java
+++ b/src/main/java/com/google/devtools/build/docgen/SkylarkDocumentationCollector.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkSignature;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.CallUtils;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
@@ -37,12 +38,11 @@
  */
 final class SkylarkDocumentationCollector {
   @SkylarkModule(
-    name = "globals",
-    title = "Globals",
-    category = SkylarkModuleCategory.TOP_LEVEL_TYPE,
-    doc = "Objects, functions and modules registered in the global environment."
-  )
-  private static final class TopLevelModule {}
+      name = "globals",
+      title = "Globals",
+      category = SkylarkModuleCategory.TOP_LEVEL_TYPE,
+      doc = "Objects, functions and modules registered in the global environment.")
+  private static final class TopLevelModule implements SkylarkValue {}
 
   private SkylarkDocumentationCollector() {}
 
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 5431c8dd..c7dec59 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -1,4 +1,5 @@
 load("@rules_java//java:defs.bzl", "java_binary", "java_library")
+load(":merge_licenses.bzl", "merge_licenses")
 
 # Description:
 #   Main Java code for Bazel
@@ -6,8 +7,6 @@
     default_visibility = ["//src:__subpackages__"],
 )
 
-load(":merge_licenses.bzl", "merge_licenses")
-
 # Generate list of all srcs via:
 # bazel query 'filter("srcs", kind("filegroup rule", //src/main/java/com/google/devtools/build/lib/...))' | sort | sed -e "s/^/\"/" | sed -e "s/$/\",/" | fgrep -v "build/lib:srcs"
 filegroup(
@@ -399,6 +398,7 @@
     ],
     deps = [
         ":skylark_semantics",
+        "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//third_party:jsr305",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
index 26df081..e6a1f9e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
@@ -34,7 +34,7 @@
 import java.util.Set;
 
 /** A global library of Starlark functions which are available only when evaluating BUILD files. */
-@SkylarkGlobalLibrary()
+@SkylarkGlobalLibrary
 class StarlarkBuildLibrary {
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
index 025f749..9dddcc0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import java.util.List;
@@ -35,7 +36,7 @@
 /** Marks configured targets that are able to supply message bundles to their dependents. */
 @AutoCodec
 @Immutable
-public final class MessageBundleInfo extends NativeInfo {
+public final class MessageBundleInfo extends NativeInfo implements SkylarkValue {
 
   public static final String SKYLARK_NAME = "MessageBundleInfo";
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
index 1a5feb0..1e5058f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PythonConfiguration.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.common.options.TriState;
 
@@ -35,7 +36,7 @@
     name = "py",
     doc = "A configuration fragment for Python.",
     category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
-public class PythonConfiguration extends BuildConfiguration.Fragment {
+public class PythonConfiguration extends BuildConfiguration.Fragment implements SkylarkValue {
 
   private final PythonVersion version;
   private final PythonVersion defaultVersion;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java
index c445eb9..71ee936 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BuildConfigurationApi.java
@@ -18,16 +18,17 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Interface for a configuration object which holds information about the build environment. */
 @SkylarkModule(
     name = "configuration",
     category = SkylarkModuleCategory.BUILTIN,
-    doc = "This object holds information about the environment in which the build is running. See "
-        + "the <a href='../rules.$DOC_EXT#configurations'>Rules page</a> for more on the general "
-        + "concept of configurations."
-)
-public interface BuildConfigurationApi {
+    doc =
+        "This object holds information about the environment in which the build is running. See"
+            + " the <a href='../rules.$DOC_EXT#configurations'>Rules page</a> for more on the"
+            + " general concept of configurations.")
+public interface BuildConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(name = "bin_dir", structField = true, documented = false)
   @Deprecated
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
index da52412..c645e58 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
@@ -18,13 +18,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** A representation of the concept "this builds these files". */
 @SkylarkModule(
     name = "file_provider",
     doc = "An interface for rules that provide files.",
     category = SkylarkModuleCategory.PROVIDER)
-public interface FileProviderApi {
+public interface FileProviderApi extends SkylarkValue {
 
   /**
    * Returns the set of files that are the "output" of this rule.
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesToRunProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesToRunProviderApi.java
index 6fb18ea..a55ff00 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesToRunProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesToRunProviderApi.java
@@ -17,11 +17,12 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import javax.annotation.Nullable;
 
 /** Returns information about executables produced by a target and the files needed to run it. */
 @SkylarkModule(name = "FilesToRunProvider", doc = "", category = SkylarkModuleCategory.PROVIDER)
-public interface FilesToRunProviderApi<FileT extends FileApi> {
+public interface FilesToRunProviderApi<FileT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(
     name = "executable",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesetEntryApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesetEntryApi.java
index 53bc977..eae1e35 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesetEntryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FilesetEntryApi.java
@@ -15,13 +15,8 @@
 package com.google.devtools.build.lib.skylarkbuildapi;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A value object used to represent an entry inside a "Fileset" BUILD rule.
- */
-@SkylarkModule(
-    name = "FilesetEntry",
-    doc = "",
-    documented = false)
-public interface FilesetEntryApi {
-}
+/** A value object used to represent an entry inside a "Fileset" BUILD rule. */
+@SkylarkModule(name = "FilesetEntry", doc = "", documented = false)
+public interface FilesetEntryApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java
index c264b01..1401f18 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FragmentCollectionApi.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.ClassObject;
 
 /** Represents a collection of configuration fragments in Skylark. */
@@ -31,4 +32,4 @@
             + "ex:</p><code>ctx.fragments.apple</code></p>"
             + "Note that rules have to declare their required fragments in order to access them "
             + "(see <a href=\"../rules.md#fragments\">here</a>).")
-public interface FragmentCollectionApi extends ClassObject {}
+public interface FragmentCollectionApi extends ClassObject, SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoConfigurationApi.java
index 6082ba8..73f0f9e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoConfigurationApi.java
@@ -16,14 +16,11 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A configuration fragment representing protocol buffers.
- */
+/** A configuration fragment representing protocol buffers. */
 @SkylarkModule(
     name = "proto",
     category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT,
-    doc = "A configuration fragment representing protocol buffers."
-)
-public interface ProtoConfigurationApi {
-}
+    doc = "A configuration fragment representing protocol buffers.")
+public interface ProtoConfigurationApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
index cdc9de0..e43073c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
@@ -19,13 +19,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** An interface for a set of runfiles. */
 @SkylarkModule(
     name = "runfiles",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "An interface for a set of runfiles.")
-public interface RunfilesApi {
+public interface RunfilesApi extends SkylarkValue {
 
   @SkylarkCallable(
     name = "files",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkCommandLineApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkCommandLineApi.java
index 2aaeb7a..2d14e41 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkCommandLineApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkCommandLineApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkDeprecated;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -29,7 +30,7 @@
     category = SkylarkModuleCategory.TOP_LEVEL_TYPE,
     doc = "Deprecated. Module for creating memory efficient command lines.")
 @StarlarkDeprecated
-public interface SkylarkCommandLineApi {
+public interface SkylarkCommandLineApi extends SkylarkValue {
 
   @SkylarkCallable(
       name = "join_paths",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
index 228b838..e4c9d0a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
@@ -19,15 +19,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
-/**
- * Interface for a module with native rule and package helper functions.
- */
+/** Interface for a module with native rule and package helper functions. */
 @SkylarkModule(
     name = "native",
     category = SkylarkModuleCategory.BUILTIN,
@@ -38,9 +37,8 @@
             + "Note that the native module is only available in the loading phase "
             + "(i.e. for macros, not for rule implementations). Attributes will ignore "
             + "<code>None</code> values, and treat them as if the attribute was unset.<br>"
-            + "The following functions are also available:"
-)
-public interface SkylarkNativeModuleApi {
+            + "The following functions are also available:")
+public interface SkylarkNativeModuleApi extends SkylarkValue {
 
   @SkylarkCallable(
       name = "glob",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TargetApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TargetApi.java
index 549e864..9bfdc5a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TargetApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TargetApi.java
@@ -17,12 +17,11 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A node in the build dependency graph, identified by a Label.
- */
+/** A node in the build dependency graph, identified by a Label. */
 @SkylarkModule(name = "target", doc = "", documented = false)
-public interface TargetApi {
+public interface TargetApi extends SkylarkValue {
 
   /**
    * Returns the label of this target.  (e.g. "//foo:bar")
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
index 790ac7d..967c4f1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
@@ -18,36 +18,29 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
-/**
- * Interface for a build target.
- */
+/** Interface for a build target. */
 @SkylarkModule(
-  name = "Target",
-  category = SkylarkModuleCategory.BUILTIN,
-  doc =
-      "A BUILD target. It is essentially a <code>struct</code> with the following fields:"
-          + "<ul>"
-          + "<li><h3 id=\"modules.Target.label\">label</h3><code><a class=\"anchor\" "
-          + "href=\"Label.html\">Label</a> Target.label</code><br>The identifier of the "
-          + "target.</li>"
-          + "<li><h3 id=\"modules.Target.files\">files</h3><code><a class=\"anchor\" "
-          + "href=\"depset.html\">depset</a> Target.files </code><br>The set of "
-          + "<a class=\"anchor\" href=\"File.html\">File</a>s produced directly by this "
-          + "target.</li>"
-          + "<li><h3 id=\"modules.Target.aspect_ids\">aspect_ids</h3><code><a class=\"anchor\""
-          + "href=\"list.html\">list</a> Target.aspect_ids </code><br>The list of "
-          + "<a class=\"anchor\" href=\"ctx.html#aspect_id\">aspect_id</a>s applied to this "
-          + "target.</li>"
-          + "<li><h3 id=\"modules.Target.extraproviders\">Extra providers</h3>For rule targets all "
-          + "additional providers provided by this target are accessible as <code>struct</code> "
-          + "fields. These extra providers are defined in the <code>struct</code> returned by the "
-          + "rule implementation function.</li>"
-          + "</ul>"
-)
-public interface TransitiveInfoCollectionApi {
+    name = "Target",
+    category = SkylarkModuleCategory.BUILTIN,
+    doc =
+        "A BUILD target. It is essentially a <code>struct</code> with the following fields:"
+            + "<ul><li><h3 id=\"modules.Target.label\">label</h3><code><a class=\"anchor\""
+            + " href=\"Label.html\">Label</a> Target.label</code><br>The identifier of the "
+            + "target.</li><li><h3 id=\"modules.Target.files\">files</h3><code><a class=\"anchor\""
+            + " href=\"depset.html\">depset</a> Target.files </code><br>The set of <a"
+            + " class=\"anchor\" href=\"File.html\">File</a>s produced directly by this "
+            + "target.</li><li><h3 id=\"modules.Target.aspect_ids\">aspect_ids</h3><code><a"
+            + " class=\"anchor\"href=\"list.html\">list</a> Target.aspect_ids </code><br>The list"
+            + " of <a class=\"anchor\" href=\"ctx.html#aspect_id\">aspect_id</a>s applied to this "
+            + "target.</li><li><h3 id=\"modules.Target.extraproviders\">Extra providers</h3>For"
+            + " rule targets all additional providers provided by this target are accessible as"
+            + " <code>struct</code> fields. These extra providers are defined in the"
+            + " <code>struct</code> returned by the rule implementation function.</li></ul>")
+public interface TransitiveInfoCollectionApi extends SkylarkValue {
 
   @SkylarkCallable(
     name = "output_group",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidBinaryDataSettingsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidBinaryDataSettingsApi.java
index 3cc126f..92ff890 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidBinaryDataSettingsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidBinaryDataSettingsApi.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Wraps common settings for working with android binary assets, resources, and manifests. */
 @SkylarkModule(
@@ -24,4 +25,4 @@
             + "Wraps common settings for working with android binary assets, resources, and "
             + "manifest",
     documented = false)
-public interface AndroidBinaryDataSettingsApi {}
+public interface AndroidBinaryDataSettingsApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java
index 404c2ad..363fb69 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidConfigurationApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Configuration fragment for Android rules. */
 @SkylarkModule(
@@ -27,7 +28,7 @@
             + "A configuration fragment for Android.",
     documented = false,
     category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
-public interface AndroidConfigurationApi {
+public interface AndroidConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(
       name = "android_cpu",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataContextApi.java
index f6bfc56..2a03d90 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataContextApi.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Wraps common tools and settings used for working with Android assets, resources, and manifests.
@@ -26,4 +27,4 @@
             + "Wraps common tools and settings used for working with Android assets, resources, and"
             + " manifests",
     documented = false)
-public interface AndroidDataContextApi {}
+public interface AndroidDataContextApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
index c3a26cf..920778f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
@@ -38,16 +39,17 @@
             + "This API is non-final and subject to change without warning; do not rely on it.",
     documented = false)
 public interface AndroidDataProcessingApi<
-    AndroidDataContextT extends AndroidDataContextApi,
-    TransitiveInfoCollectionT extends TransitiveInfoCollectionApi,
-    FileT extends FileApi,
-    SpecialFileT extends FileApi,
-    AndroidAssetsInfoT extends AndroidAssetsInfoApi<?, ?>,
-    AndroidResourcesInfoT extends AndroidResourcesInfoApi<?, ?, ?>,
-    AndroidManifestInfoT extends AndroidManifestInfoApi<?>,
-    AndroidLibraryAarInfoT extends AndroidLibraryAarInfoApi<?>,
-    AndroidBinaryDataInfoT extends AndroidBinaryDataInfoApi<?>,
-    ValidatedAndroidDataT extends ValidatedAndroidDataApi<?, ?>> {
+        AndroidDataContextT extends AndroidDataContextApi,
+        TransitiveInfoCollectionT extends TransitiveInfoCollectionApi,
+        FileT extends FileApi,
+        SpecialFileT extends FileApi,
+        AndroidAssetsInfoT extends AndroidAssetsInfoApi<?, ?>,
+        AndroidResourcesInfoT extends AndroidResourcesInfoApi<?, ?, ?>,
+        AndroidManifestInfoT extends AndroidManifestInfoApi<?>,
+        AndroidLibraryAarInfoT extends AndroidLibraryAarInfoApi<?>,
+        AndroidBinaryDataInfoT extends AndroidBinaryDataInfoApi<?>,
+        ValidatedAndroidDataT extends ValidatedAndroidDataApi<?, ?>>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "assets_from_deps",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidManifestApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidManifestApi.java
index 5ebe825..1049f13 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidManifestApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidManifestApi.java
@@ -15,6 +15,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Wraps an Android Manifest and provides utilities for working with it */
 @SkylarkModule(
@@ -25,4 +26,4 @@
             + "Wraps an Android Manifest and provides utilities to work with it.",
     documented = false,
     category = SkylarkModuleCategory.PROVIDER)
-public interface AndroidManifestApi {}
+public interface AndroidManifestApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
index be95a45..4649889 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import javax.annotation.Nullable;
 
 /**
@@ -38,7 +39,7 @@
             + "provides this struct, accessible as a <code>android</code> field on a "
             + "<a href=\"Target.html\">target</a>.",
     documented = false)
-public interface AndroidSkylarkApiProviderApi<FileT extends FileApi> {
+public interface AndroidSkylarkApiProviderApi<FileT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(
       name = "apk",
@@ -152,7 +153,7 @@
               + "it, you will be broken when it is removed."
               + "Provides access to information about Android rules.",
       documented = false)
-  interface IdlInfoApi<FileT extends FileApi> {
+  interface IdlInfoApi<FileT extends FileApi> extends SkylarkValue {
     @SkylarkCallable(
         name = "import_root",
         structField = true,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java
index 76c6bd1..ab0d5d2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkCommonApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** Common utilities for Skylark rules related to Android. */
@@ -28,7 +29,8 @@
             + "you will be broken when it is removed."
             + "Common utilities and functionality related to Android rules.",
     documented = false)
-public interface AndroidSkylarkCommonApi<FileT extends FileApi, JavaInfoT extends JavaInfoApi<?>> {
+public interface AndroidSkylarkCommonApi<FileT extends FileApi, JavaInfoT extends JavaInfoApi<?>>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "create_device_broker_info",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
index bf9e66a..b7f4f9d 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import javax.annotation.Nullable;
@@ -49,7 +50,7 @@
           "Do not use this module. It is intended for migration purposes only. If you depend on "
               + "it, you will be broken when it is removed.",
       documented = false)
-  public class LabelJavaPackagePair {
+  public class LabelJavaPackagePair implements SkylarkValue {
 
     private final String label;
     private final String javaPackage;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ParsedAndroidAssetsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ParsedAndroidAssetsApi.java
index f8e772d..1b2b7d1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ParsedAndroidAssetsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ParsedAndroidAssetsApi.java
@@ -15,6 +15,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Parsed Android assets which can be merged together with assets from dependencies. */
 @SkylarkModule(
@@ -25,4 +26,4 @@
             + "Information about the Android assets provided by a rule.",
     documented = false,
     category = SkylarkModuleCategory.PROVIDER)
-public interface ParsedAndroidAssetsApi {}
+public interface ParsedAndroidAssetsApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ValidatedAndroidDataApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ValidatedAndroidDataApi.java
index 30fb3a6..3e89181 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ValidatedAndroidDataApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ValidatedAndroidDataApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import javax.annotation.Nullable;
@@ -31,12 +32,13 @@
     documented = false,
     category = SkylarkModuleCategory.PROVIDER)
 public interface ValidatedAndroidDataApi<
-    FileT extends FileApi,
-    AndroidResourcesInfoT extends
-        AndroidResourcesInfoApi<
-                FileT,
-                ? extends ValidatedAndroidDataApi<FileT, AndroidResourcesInfoT>,
-                ? extends AndroidManifestInfoApi<FileT>>> {
+        FileT extends FileApi,
+        AndroidResourcesInfoT extends
+            AndroidResourcesInfoApi<
+                    FileT,
+                    ? extends ValidatedAndroidDataApi<FileT, AndroidResourcesInfoT>,
+                    ? extends AndroidManifestInfoApi<FileT>>>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "to_provider",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java
index 7f646f6..5a7c2e6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleCommonApi.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
@@ -36,10 +37,11 @@
     name = "apple_common",
     doc = "Functions for Starlark to access internals of the apple rule implementations.")
 public interface AppleCommonApi<
-    FileApiT extends FileApi,
-    ObjcProviderApiT extends ObjcProviderApi<?>,
-    XcodeConfigProviderApiT extends XcodeConfigProviderApi<?, ?>,
-    ApplePlatformApiT extends ApplePlatformApi> {
+        FileApiT extends FileApi,
+        ObjcProviderApiT extends ObjcProviderApi<?>,
+        XcodeConfigProviderApiT extends XcodeConfigProviderApi<?, ?>,
+        ApplePlatformApiT extends ApplePlatformApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "apple_toolchain",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleConfigurationApi.java
index 8d5e042..8a7a8c6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleConfigurationApi.java
@@ -18,15 +18,16 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkDeprecated;
 
 /** An interface for a configuration type containing info for Apple platforms and tools. */
 @SkylarkModule(
     name = "apple",
     doc = "A configuration fragment for Apple platforms.",
-    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
-public interface AppleConfigurationApi<ApplePlatformTypeApiT extends ApplePlatformTypeApi> {
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface AppleConfigurationApi<ApplePlatformTypeApiT extends ApplePlatformTypeApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "ios_cpu",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleToolchainApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleToolchainApi.java
index e097692..14698ea 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleToolchainApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/AppleToolchainApi.java
@@ -17,15 +17,14 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Interface for a utility module involving the Apple toolchain.
- */
+/** Interface for a utility module involving the Apple toolchain. */
 @SkylarkModule(
     name = "apple_toolchain",
-    doc = "Utilities for resolving items from the Apple toolchain."
-)
-public interface AppleToolchainApi<AppleConfigurationApiT extends AppleConfigurationApi<?>> {
+    doc = "Utilities for resolving items from the Apple toolchain.")
+public interface AppleToolchainApi<AppleConfigurationApiT extends AppleConfigurationApi<?>>
+    extends SkylarkValue {
 
   @SkylarkCallable(
     name = "sdk_dir",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/J2ObjcConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/J2ObjcConfigurationApi.java
index 0af2f36..b4be93d 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/J2ObjcConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/J2ObjcConfigurationApi.java
@@ -18,16 +18,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A configuration fragment for j2objc.
- */
+/** A configuration fragment for j2objc. */
 @SkylarkModule(
     name = "j2objc",
     category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT,
-    doc = "A configuration fragment for j2Objc."
-)
-public interface J2ObjcConfigurationApi {
+    doc = "A configuration fragment for j2Objc.")
+public interface J2ObjcConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(
       name = "translation_flags",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcConfigurationApi.java
index 1109e45..88e50aa 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcConfigurationApi.java
@@ -19,17 +19,16 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import javax.annotation.Nullable;
 
-/**
- * A configuration fragment for Objective C.
- */
+/** A configuration fragment for Objective C. */
 @SkylarkModule(
-  name = "objc",
-  category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT,
-  doc = "A configuration fragment for Objective-C."
-)
-public interface ObjcConfigurationApi<ApplePlatformTypeApiT extends ApplePlatformTypeApi> {
+    name = "objc",
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT,
+    doc = "A configuration fragment for Objective-C.")
+public interface ObjcConfigurationApi<ApplePlatformTypeApiT extends ApplePlatformTypeApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "ios_simulator_device",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/SwiftConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/SwiftConfigurationApi.java
index bfea060..24d5057 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/SwiftConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/SwiftConfigurationApi.java
@@ -18,16 +18,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A configuration fragment for Swift tools.
- */
+/** A configuration fragment for Swift tools. */
 @SkylarkModule(
     name = "swift",
     doc = "A configuration fragment for Swift tools.",
-    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
-public interface SwiftConfigurationApi {
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface SwiftConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(
     name = "copts",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigSkylarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigSkylarkCommonApi.java
index 73fee38..7127909 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigSkylarkCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigSkylarkCommonApi.java
@@ -17,12 +17,13 @@
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Helper utility containing functions regarding configurations.ss */
 @SkylarkModule(
     name = "config_common",
     doc = "Functions for Starlark to interact with Blaze's configurability APIs.")
-public interface ConfigSkylarkCommonApi {
+public interface ConfigSkylarkCommonApi extends SkylarkValue {
 
   @SkylarkCallable(
     name = "FeatureFlagInfo",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
index fb0df89..bda0516 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /**
@@ -28,7 +29,7 @@
     doc =
         "Immutable store of information needed for C++ compilation that is aggregated across "
             + "dependencies.")
-public interface CcCompilationContextApi {
+public interface CcCompilationContextApi extends SkylarkValue {
   @SkylarkCallable(
       name = "defines",
       doc =
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
index fcb1196..fe5b519 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
@@ -30,7 +31,7 @@
     category = SkylarkModuleCategory.BUILTIN,
     documented = true,
     doc = "Helper class containing CC compilation outputs.")
-public interface CcCompilationOutputsApi<FileT extends FileApi> {
+public interface CcCompilationOutputsApi<FileT extends FileApi> extends SkylarkValue {
 
   /** @deprecated use {@link #getSkylarkObjects} or {@link #getSkylarkPicObjects}. */
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
index bdba1bc..51fa062 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingContextApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
@@ -30,7 +31,7 @@
     doc =
         "Immutable store of information needed for C++ linking that is aggregated across "
             + "dependencies.")
-public interface CcLinkingContextApi<FileT extends FileApi> {
+public interface CcLinkingContextApi<FileT extends FileApi> extends SkylarkValue {
   @SkylarkCallable(
       name = "user_link_flags",
       doc = "Returns the list of user link flags passed as strings.",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
index 71286aa..bae0f35 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcLinkingOutputsApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Interface for a structured representation of the linking outputs of a C++ rule. */
 @SkylarkModule(
@@ -25,7 +26,7 @@
     category = SkylarkModuleCategory.BUILTIN,
     documented = true,
     doc = "Helper class containing CC compilation outputs.")
-public interface CcLinkingOutputsApi<FileT extends FileApi> {
+public interface CcLinkingOutputsApi<FileT extends FileApi> extends SkylarkValue {
   @SkylarkCallable(
       name = "library_to_link",
       structField = true,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index 542e951..668a934 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime.NoneType;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
@@ -38,18 +39,19 @@
     name = "cc_common",
     doc = "Utilities for C++ compilation, linking, and command line generation.")
 public interface CcModuleApi<
-    SkylarkActionFactoryT extends SkylarkActionFactoryApi,
-    FileT extends FileApi,
-    CcToolchainProviderT extends CcToolchainProviderApi<?>,
-    FeatureConfigurationT extends FeatureConfigurationApi,
-    CompilationContextT extends CcCompilationContextApi,
-    LinkerInputT extends LinkerInputApi<LibraryToLinkT, FileT>,
-    LinkingContextT extends CcLinkingContextApi<?>,
-    LibraryToLinkT extends LibraryToLinkApi<FileT>,
-    CcToolchainVariablesT extends CcToolchainVariablesApi,
-    SkylarkRuleContextT extends SkylarkRuleContextApi,
-    CcToolchainConfigInfoT extends CcToolchainConfigInfoApi,
-    CompilationOutputsT extends CcCompilationOutputsApi<FileT>> {
+        SkylarkActionFactoryT extends SkylarkActionFactoryApi,
+        FileT extends FileApi,
+        CcToolchainProviderT extends CcToolchainProviderApi<?>,
+        FeatureConfigurationT extends FeatureConfigurationApi,
+        CompilationContextT extends CcCompilationContextApi,
+        LinkerInputT extends LinkerInputApi<LibraryToLinkT, FileT>,
+        LinkingContextT extends CcLinkingContextApi<?>,
+        LibraryToLinkT extends LibraryToLinkApi<FileT>,
+        CcToolchainVariablesT extends CcToolchainVariablesApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        CcToolchainConfigInfoT extends CcToolchainConfigInfoApi,
+        CompilationOutputsT extends CcCompilationOutputsApi<FileT>>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "CcToolchainInfo",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
index 79fe8a1..3788c1b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
@@ -20,19 +20,17 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Object with information about C++ rules. Every C++-related target should provide this.
- */
+/** Object with information about C++ rules. Every C++-related target should provide this. */
 @SkylarkModule(
-  name = "CcSkylarkApiProvider",
-  category = SkylarkModuleCategory.PROVIDER,
-  doc =
-      "Provides access to information about C++ rules.  "
-          + "Every C++-related target provides this struct, accessible as a <code>cc</code> field "
-          + "on <a href=\"Target.html\">target</a>."
-)
-public interface CcSkylarkApiProviderApi<FileT extends FileApi> {
+    name = "CcSkylarkApiProvider",
+    category = SkylarkModuleCategory.PROVIDER,
+    doc =
+        "Provides access to information about C++ rules.  Every C++-related target provides this"
+            + " struct, accessible as a <code>cc</code> field on <a"
+            + " href=\"Target.html\">target</a>.")
+public interface CcSkylarkApiProviderApi<FileT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(
       name = "transitive_headers",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainVariablesApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainVariablesApi.java
index 2ac30a3..6718b29 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainVariablesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainVariablesApi.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Type encapsulating build variables. */
 @SkylarkModule(
@@ -23,4 +24,4 @@
     documented = false,
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Class encapsulating cc_toolchain variables.")
-public interface CcToolchainVariablesApi {}
+public interface CcToolchainVariablesApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
index a408159..9dd0594 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
@@ -17,17 +17,15 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Interface for a helper class containing CC compilation providers.
- */
+/** Interface for a helper class containing CC compilation providers. */
 @SkylarkModule(
     name = "compilation_info",
     documented = false,
     category = SkylarkModuleCategory.BUILTIN,
-    doc = "Helper class containing CC compilation providers."
-)
-public interface CompilationInfoApi {
+    doc = "Helper class containing CC compilation providers.")
+public interface CompilationInfoApi extends SkylarkValue {
   @SkylarkCallable(name = "cc_compilation_outputs", structField = true, documented = false)
   CcCompilationOutputsApi<?> getCcCompilationOutputs();
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CppConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CppConfigurationApi.java
index 55f2d43..dd403a1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CppConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CppConfigurationApi.java
@@ -18,17 +18,16 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 
-/**
- * The C++ configuration fragment.
- */
+/** The C++ configuration fragment. */
 @SkylarkModule(
-  name = "cpp",
-  doc = "A configuration fragment for C++.",
-  category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
-public interface CppConfigurationApi <InvalidConfigurationExceptionT extends Exception> {
+    name = "cpp",
+    doc = "A configuration fragment for C++.",
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface CppConfigurationApi<InvalidConfigurationExceptionT extends Exception>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "copts",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/FeatureConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/FeatureConfigurationApi.java
index a406c6e..c99e7bf 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/FeatureConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/FeatureConfigurationApi.java
@@ -16,10 +16,11 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Class used to construct command lines from CROSSTOOL features. */
 @SkylarkModule(
     name = "FeatureConfiguration",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Class used to construct command lines from CROSSTOOL features.")
-public interface FeatureConfigurationApi {}
+public interface FeatureConfigurationApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
index 05eac498..1bfc17f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LibraryToLinkApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 
 /**
@@ -28,7 +29,7 @@
     name = "LibraryToLink",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "A library the user can link against.")
-public interface LibraryToLinkApi<FileT extends FileApi> {
+public interface LibraryToLinkApi<FileT extends FileApi> extends SkylarkValue {
   @SkylarkCallable(
       name = "objects",
       allowReturnNones = true,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java
index 10371d6..a82f769 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkerInputApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
@@ -31,7 +32,8 @@
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Either libraries, flags or other files that may be passed to the linker as inputs.")
 public interface LinkerInputApi<
-    LibraryToLinkT extends LibraryToLinkApi<FileT>, FileT extends FileApi> {
+        LibraryToLinkT extends LibraryToLinkApi<FileT>, FileT extends FileApi>
+    extends SkylarkValue {
   @SkylarkCallable(
       name = "owner",
       doc = "Returns the owner of this LinkerInput.",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkingInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkingInfoApi.java
index 3dbc4b4..7cf889c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkingInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/LinkingInfoApi.java
@@ -17,17 +17,15 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Helper object containing CC linking info objects.
- */
+/** Helper object containing CC linking info objects. */
 @SkylarkModule(
-  name = "linking_info",
-  documented = false,
-  category = SkylarkModuleCategory.BUILTIN,
-  doc = "Helper class containing CC linking providers."
-)
-public interface LinkingInfoApi {
+    name = "linking_info",
+    documented = false,
+    category = SkylarkModuleCategory.BUILTIN,
+    doc = "Helper class containing CC linking providers.")
+public interface LinkingInfoApi extends SkylarkValue {
 
   @SkylarkCallable(name = "linking_context", structField = true, documented = false)
   CcLinkingContextApi<?> getCcLinkingContext();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
index 07c7be6..27eede4 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime.NoneType;
 import com.google.devtools.build.lib.syntax.SkylarkList;
@@ -35,13 +36,14 @@
  */
 @SkylarkModule(name = "WrapCcHelperDoNotUse", doc = "", documented = false)
 public interface WrapCcHelperApi<
-    FeatureConfigurationT extends FeatureConfigurationApi,
-    SkylarkRuleContextT extends SkylarkRuleContextApi,
-    CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
-    CompilationInfoT extends CompilationInfoApi,
-    FileT extends FileApi,
-    CcCompilationContextT extends CcCompilationContextApi,
-    WrapCcIncludeProviderT extends WrapCcIncludeProviderApi> {
+        FeatureConfigurationT extends FeatureConfigurationApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
+        CompilationInfoT extends CompilationInfoApi,
+        FileT extends FileApi,
+        CcCompilationContextT extends CcCompilationContextApi,
+        WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "feature_configuration",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java
index 3a72cd3..d896d56 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java
@@ -16,10 +16,11 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** A configuration fragment for Go. */
 @SkylarkModule(
     name = "go",
     doc = "A configuration fragment for Go.",
     category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
-public interface GoConfigurationApi {}
+public interface GoConfigurationApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
index 5fb7905..6be778c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import javax.annotation.Nullable;
 
 /**
@@ -30,7 +31,7 @@
     name = "java_annotation_processing",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Information about jars that are a result of annotation processing for a Java rule.")
-public interface JavaAnnotationProcessingApi<FileTypeT extends FileApi> {
+public interface JavaAnnotationProcessingApi<FileTypeT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(
     name = "enabled",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
index 31b659d..23295ba 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
@@ -33,7 +34,7 @@
             + "Information about the c++ libraries to be linked into Java targets.",
     documented = true,
     category = SkylarkModuleCategory.PROVIDER)
-public interface JavaCcLinkParamsProviderApi<CcInfoApiT extends CcInfoApi> {
+public interface JavaCcLinkParamsProviderApi<CcInfoApiT extends CcInfoApi> extends SkylarkValue {
   /** Name of this info object. */
   public static String NAME = "JavaCcLinkParamsInfo";
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
index 99d5d90..bdeacba 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -35,12 +36,13 @@
 /** Utilities for Java compilation support in Skylark. */
 @SkylarkModule(name = "java_common", doc = "Utilities for Java compilation support in Starlark.")
 public interface JavaCommonApi<
-    FileT extends FileApi,
-    JavaInfoT extends JavaInfoApi<FileT>,
-    JavaToolchainT extends JavaToolchainSkylarkApiProviderApi,
-    JavaRuntimeT extends JavaRuntimeInfoApi,
-    SkylarkRuleContextT extends SkylarkRuleContextApi,
-    SkylarkActionFactoryT extends SkylarkActionFactoryApi> {
+        FileT extends FileApi,
+        JavaInfoT extends JavaInfoApi<FileT>,
+        JavaToolchainT extends JavaToolchainSkylarkApiProviderApi,
+        JavaRuntimeT extends JavaRuntimeInfoApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        SkylarkActionFactoryT extends SkylarkActionFactoryApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "provider",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCompilationInfoProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCompilationInfoProviderApi.java
index b344eef..7127cbe 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCompilationInfoProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCompilationInfoProviderApi.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** Info object for compilation information for java rules. */
@@ -26,7 +27,7 @@
     name = "java_compilation_info",
     category = SkylarkModuleCategory.PROVIDER,
     doc = "Provides access to compilation information for Java rules.")
-public interface JavaCompilationInfoProviderApi<FileT extends FileApi> {
+public interface JavaCompilationInfoProviderApi<FileT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(name = "javac_options", structField = true, doc = "Options to java compiler.")
   public ImmutableList<String> getJavacOpts();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaConfigurationApi.java
index 7f314cd..78ab970 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaConfigurationApi.java
@@ -19,16 +19,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * A java compiler configuration.
- */
+/** A java compiler configuration. */
 @SkylarkModule(
     name = "java",
     doc = "A java compiler configuration.",
-    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
-public interface JavaConfigurationApi {
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface JavaConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(name = "default_javac_flags", structField = true,
       doc = "The default flags for the Java compiler.")
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaProtoCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaProtoCommonApi.java
index e06096f..7679b52 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaProtoCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaProtoCommonApi.java
@@ -20,15 +20,16 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 
-/**
- * Helper class for Java proto compilation.
- */
+/** Helper class for Java proto compilation. */
 @SkylarkModule(name = "java_proto_common", doc = "Helper class for Java proto compilation.")
-public interface JavaProtoCommonApi<FileT extends FileApi,
-    SkylarkRuleContextT extends SkylarkRuleContextApi,
-    TransitiveInfoCollectionT extends TransitiveInfoCollectionApi> {
+public interface JavaProtoCommonApi<
+        FileT extends FileApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        TransitiveInfoCollectionT extends TransitiveInfoCollectionApi>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "create_java_lite_proto_compile_action",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuleOutputJarsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
index 778a1bf..faadd82 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuleOutputJarsProviderApi.java
@@ -19,13 +19,15 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** Info object about outputs of a Java rule. */
 @SkylarkModule(
     name = "java_output_jars",
     category = SkylarkModuleCategory.PROVIDER,
     doc = "Information about outputs of a Java rule.")
-public interface JavaRuleOutputJarsProviderApi<OutputJarT extends OutputJarApi<?>> {
+public interface JavaRuleOutputJarsProviderApi<OutputJarT extends OutputJarApi<?>>
+    extends SkylarkValue {
 
   @SkylarkCallable(name = "jars", doc = "A list of jars the rule outputs.", structField = true)
   public ImmutableList<OutputJarT> getOutputJars();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuntimeClasspathProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
index 8c80ca8..78261db 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaRuntimeClasspathProviderApi.java
@@ -16,11 +16,12 @@
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** Provider for the runtime classpath contributions of a Java binary. */
 @SkylarkModule(name = "JavaRuntimeClasspathProvider", doc = "", documented = false)
-public interface JavaRuntimeClasspathProviderApi {
+public interface JavaRuntimeClasspathProviderApi extends SkylarkValue {
 
   @SkylarkCallable(name = "runtime_classpath", documented = false, structField = true)
   public SkylarkNestedSet /*<File>*/ getRuntimeClasspath();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
index f100116..c6cd44b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkDeprecated;
 
 /**
@@ -32,4 +33,4 @@
             + " href=\"https://docs.bazel.build/versions/master/skylark/lib/JavaInfo.html\">JavaInfo</a>"
             + " instead.")
 @StarlarkDeprecated
-public interface JavaSkylarkApiProviderApi<FileT extends FileApi> {}
+public interface JavaSkylarkApiProviderApi<FileT extends FileApi> extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/OutputJarApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/OutputJarApi.java
index 5ef2cd7..dcc01af 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/OutputJarApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/OutputJarApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 
 /** A tuple of a java classes jar and its associated source and interface archives. */
@@ -25,7 +26,7 @@
     name = "java_output",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Java classes jar, together with their associated source and interface archives.")
-public interface OutputJarApi<FileT extends FileApi> {
+public interface OutputJarApi<FileT extends FileApi> extends SkylarkValue {
 
   @SkylarkCallable(
     name = "class_jar",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
index e07a30b..6413346 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
@@ -17,13 +17,14 @@
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** Module containing functions to interact with the platform APIs. */
 @SkylarkModule(
     name = "platform_common",
     doc = "Functions for Starlark to interact with the platform APIs.")
-public interface PlatformCommonApi {
+public interface PlatformCommonApi extends SkylarkValue {
   @SkylarkCallable(
       name = "TemplateVariableInfo",
       doc =
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformConfigurationApi.java
index 06841e9..c2e551f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformConfigurationApi.java
@@ -19,17 +19,15 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import java.util.List;
 
-/**
- * The platform configuration.
- */
+/** The platform configuration. */
 @SkylarkModule(
     name = "platform",
     doc = "The platform configuration.",
-    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT
-)
-public interface PlatformConfigurationApi {
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface PlatformConfigurationApi extends SkylarkValue {
 
   @SkylarkCallable(name = "host_platform", structField = true, doc = "The current host platform")
   Label getHostPlatform();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoModuleApi.java
index 3c36c85..94d9d30 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoModuleApi.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.skylarkbuildapi.proto;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Interface for protocol buffers support in Bazel.
@@ -30,4 +31,4 @@
             + "to load this symbol from <a href=\"https://github.com/bazelbuild/rules_proto\">"
             + "rules_proto</a>"
             + "</p>")
-public interface ProtoModuleApi {}
+public interface ProtoModuleApi extends SkylarkValue {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyStarlarkTransitionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyStarlarkTransitionsApi.java
index 1cd58f3..16295b0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyStarlarkTransitionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyStarlarkTransitionsApi.java
@@ -29,7 +29,7 @@
         "DO NOT USE. This is intended for Python 2 to 3 migration purposes only. If you depend"
             + " on it, you will be broken when it is removed.",
     documented = false)
-public interface PyStarlarkTransitionsApi {
+public interface PyStarlarkTransitionsApi extends SkylarkValue {
 
   @SkylarkCallable(
       name = "cfg",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java
index 0003f55..c0311af 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkExecutionResultApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * A structure callable from Skylark that stores the result of repository_ctx.execute() method. It
@@ -30,7 +31,7 @@
         "A structure storing result of repository_ctx.execute() method. It contains the standard"
             + " output stream content, the standard error stream content and the execution return"
             + " code.")
-public interface SkylarkExecutionResultApi {
+public interface SkylarkExecutionResultApi extends SkylarkValue {
   @SkylarkCallable(
       name = "return_code",
       structField = true,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java
index 7ac322f..51a3b71 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkOSApi.java
@@ -18,13 +18,14 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /** A Skylark structure to deliver information about the system we are running on. */
 @SkylarkModule(
     name = "repository_os",
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Various data about the current platform Bazel is running on.")
-public interface SkylarkOSApi {
+public interface SkylarkOSApi extends SkylarkValue {
   @SkylarkCallable(name = "environ", structField = true, doc = "The list of environment variables.")
   public ImmutableMap<String, String> getEnvironmentVariables();
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
index 4b28d0c..3f7e470 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
@@ -34,9 +35,9 @@
         "The context of the repository rule containing"
             + " helper functions and information about attributes. You get a repository_ctx object"
             + " as an argument to the <code>implementation</code> function when you create a"
-            + " repository rule."
-)
-public interface SkylarkRepositoryContextApi<RepositoryFunctionExceptionT extends Throwable> {
+            + " repository rule.")
+public interface SkylarkRepositoryContextApi<RepositoryFunctionExceptionT extends Throwable>
+    extends SkylarkValue {
 
   @SkylarkCallable(
       name = "name",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/TestingModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/TestingModuleApi.java
index 42d7d5f..c005b20 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/TestingModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/TestingModuleApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 
@@ -24,7 +25,7 @@
 @SkylarkModule(
     name = "testing",
     doc = "Helper methods for Starlark to access testing infrastructure.")
-public interface TestingModuleApi {
+public interface TestingModuleApi extends SkylarkValue {
 
   // TODO(bazel-team): Change this function to be the actual ExecutionInfo.PROVIDER.
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkModule.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkModule.java
index 6a6c2ac..30a4366 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkModule.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkModule.java
@@ -45,9 +45,11 @@
  * them to define different methods, while annotating {@link SkylarkList} allows them to be
  * identified as a single type for the purpose of type checking, documentation, and error messages.
  *
- * <p>All {@code @SkylarkModule}-annotated types should implement {@link SkylarkValue}. Conversely,
- * all non-abstract implementations of {@link SkylarkValue} should have or inherit a {@code
- * @SkylarkModule} annotation.
+ * <p>All {@code @SkylarkModule}-annotated types must implement {@link SkylarkValue}. Nearly all
+ * non-abstract implementations of {@link SkylarkValue} have or inherit a {@code @SkylarkModule}
+ * annotation. (It is possible, though quite unusual, to declare an implementation of {@code
+ * SkylarkValue} without using the annotation mechanism defined in this package. {@code
+ * StarlarkFunction} is one example.)
  */
 @Target({ElementType.TYPE})
 @Retention(RetentionPolicy.RUNTIME)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
index d3f25f8..f44420c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkValue.java
@@ -14,6 +14,8 @@
 
 package com.google.devtools.build.lib.skylarkinterface;
 
+import com.google.devtools.build.lib.concurrent.ThreadSafety;
+
 /** Base interface for all Starlark values besides boxed Java primitives. */
 public interface SkylarkValue {
 
@@ -63,8 +65,14 @@
    * <p>Immutability is deep, i.e. in order for a value to be immutable, all values it is composed
    * of must be immutable, too.
    */
+  // TODO(adonovan): eliminate this concept. All uses really need to know is, is it hashable?,
+  // because Starlark values must have stable hashes: a hashable value must either be immutable or
+  // its hash must be part of its identity.
+  // But this must wait until --incompatible_disallow_hashing_frozen_mutables=true is removed.
+  // (see github.com/bazelbuild/bazel/issues/7800)
   default boolean isImmutable() {
-      return false;
+    // TODO(adonovan): this is an abuse of an unrelated annotation.
+    return getClass().isAnnotationPresent(ThreadSafety.Immutable.class);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
index 0a98d5c..48b7ea7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
@@ -18,6 +18,8 @@
 import com.google.common.collect.SetMultimap;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.util.HashSet;
 import java.util.List;
@@ -49,19 +51,19 @@
  *   <li>The method must be non-static.
  *   <li>If structField=true, there must be zero user-supplied parameters.
  *   <li>Method parameters must be supplied in the following order:
- *       <pre>method([positionals]*[other user-args](Location)(FuncallExpression)(Environment))
+ *       <pre>method([positionals]*[other user-args](Location)(FuncallExpression)(StarlarkThread))
  *       </pre>
- *       where Location, FuncallExpression, and Environment are supplied by the interpreter if and
- *       only if useLocation, useAst, and useStarlarkThread are specified, respectively.
+ *       where Location, FuncallExpression, and StarlarkThread are supplied by the interpreter if
+ *       and only if useLocation, useAst, and useStarlarkThread are specified, respectively.
  *   <li>The number of method parameters must match the number of annotation-declared parameters
  *       plus the number of interpreter-supplied parameters.
  *   <li>Each parameter, if explicitly typed, may only use either 'type' or 'allowedTypes', not
  *       both.
  *   <li>Parameters may not specify their generic types (they must use the <code>?</code> wildcard
  *       exclusively.
- *   <li>Noneable parameters must have java parameter type Object (as the actual value may be either
- *       {@code None} or a value of a non-{@code None} type, which do not share a superclass other
- *       than Object (or SkylarkValue, which is typically no more descriptive than Object).
+ *   <li>Noneable parameters must have Java parameter type Object, as the actual value may be either
+ *       {@code None} or some other value, which do not share a superclass other than Object (or
+ *       SkylarkValue, which is typically no more descriptive than Object).
  *   <li>Each parameter must be positional or named (or both).
  *   <li>Positional-only parameters must be specified before any named parameters.
  *   <li>Positional parameters must be specified before any non-positional parameters.
@@ -71,12 +73,18 @@
  *   <li>Each class may only have one annotated method with selfCall=true.
  *   <li>A method annotated with selfCall=true must have a non-empty name.
  *   <li>A method annotated with selfCall=true must have structField=false.
+ *   <li>The method's class must implement SkylarkValue.
  * </ul>
  *
  * <p>These properties can be relied upon at runtime without additional checks.
  */
-@SupportedAnnotationTypes({"com.google.devtools.build.lib.skylarkinterface.SkylarkCallable"})
+@SupportedAnnotationTypes({
+  "com.google.devtools.build.lib.skylarkinterface.SkylarkCallable",
+  "com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary",
+  "com.google.devtools.build.lib.skylarkinterface.SkylarkModule"
+})
 public final class SkylarkCallableProcessor extends AbstractProcessor {
+  private ProcessingEnvironment env;
   private Messager messager;
 
   // A set containing the names of all classes which have a method with @SkylarkCallable.selfCall.
@@ -90,9 +98,12 @@
       "com.google.devtools.build.lib.syntax.SkylarkDict<?,?>";
   private static final String LOCATION = "com.google.devtools.build.lib.events.Location";
   private static final String AST = "com.google.devtools.build.lib.syntax.FuncallExpression";
-  private static final String ENVIRONMENT = "com.google.devtools.build.lib.syntax.StarlarkThread";
+  private static final String STARLARK_THREAD =
+      "com.google.devtools.build.lib.syntax.StarlarkThread";
   private static final String STARLARK_SEMANTICS =
       "com.google.devtools.build.lib.syntax.StarlarkSemantics";
+  private static final String SKYLARK_VALUE =
+      "com.google.devtools.build.lib.skylarkinterface.SkylarkValue";
 
   @Override
   public SourceVersion getSupportedSourceVersion() {
@@ -100,17 +111,41 @@
   }
 
   @Override
-  public synchronized void init(ProcessingEnvironment processingEnv) {
-    super.init(processingEnv);
-    messager = processingEnv.getMessager();
+  public synchronized void init(ProcessingEnvironment env) {
+    super.init(env);
+    this.env = env;
+    messager = env.getMessager();
     classesWithSelfcall = new HashSet<>();
     processedClassMethods = LinkedHashMultimap.create();
   }
 
   @Override
   public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-    for (Element element : roundEnv.getElementsAnnotatedWith(SkylarkCallable.class)) {
+    // Ensure SkylarkModule-annotated classes implement SkylarkValue.
+    TypeElement skylarkValueType = env.getElementUtils().getTypeElement(SKYLARK_VALUE);
+    if (skylarkValueType == null) {
+      messager.printMessage(Diagnostic.Kind.ERROR, "no SkylarkValue type in compilation unit");
+      return true;
+    }
+    for (Element cls : roundEnv.getElementsAnnotatedWith(SkylarkModule.class)) {
+      if (!env.getTypeUtils().isAssignable(cls.asType(), skylarkValueType.asType())) {
+        error(
+            cls,
+            String.format(
+                "class %s has @SkylarkModule annotation but does not implement SkylarkValue",
+                cls.getSimpleName()));
+      }
+    }
 
+    // TODO(adonovan): reject a SkylarkCallable-annotated method whose class doesn't have (or
+    // inherit) a SkylarkModule documentation annotation.
+
+    // Only SkylarkGlobalLibrary-annotated classes, and those that implement SkylarkValue,
+    // are allowed SkylarkCallable-annotated methods.
+    Set<Element> okClasses =
+        new HashSet<>(roundEnv.getElementsAnnotatedWith(SkylarkGlobalLibrary.class));
+
+    for (Element element : roundEnv.getElementsAnnotatedWith(SkylarkCallable.class)) {
       // Only methods are annotated with SkylarkCallable. This is verified by the
       // @Target(ElementType.METHOD) annotation.
       ExecutableElement methodElement = (ExecutableElement) element;
@@ -136,8 +171,23 @@
         verifyFlagToggles(methodElement, annotation);
         verifyNoNameConflict(methodElement, annotation);
       } catch (SkylarkCallableProcessorException exception) {
+        // TODO(adonovan): don't use exceptions; report multiple errors per pass
+        // as this saves time in compiler-driven refactoring.
         error(exception.methodElement, exception.errorMessage);
       }
+
+      // Check that the method's class is SkylarkGlobalLibrary-annotated,
+      // or implements SkylarkValue, or an error has already been reported.
+      Element cls = methodElement.getEnclosingElement();
+      if (okClasses.add(cls)
+          && !env.getTypeUtils().isAssignable(cls.asType(), skylarkValueType.asType())) {
+        error(
+            cls,
+            String.format(
+                "method %s has @SkylarkCallable annotation but enclosing class %s does not"
+                    + " implement SkylarkValue nor has @SkylarkGlobalLibrary annotation",
+                methodElement.getSimpleName(), cls.getSimpleName()));
+      }
     }
 
     return true;
@@ -472,14 +522,14 @@
       currentIndex++;
     }
     if (annotation.useStarlarkThread()) {
-      if (!ENVIRONMENT.equals(methodSignatureParams.get(currentIndex).asType().toString())) {
+      if (!STARLARK_THREAD.equals(methodSignatureParams.get(currentIndex).asType().toString())) {
         throw new SkylarkCallableProcessorException(
             methodElement,
             String.format(
                 "Expected parameter index %d to be the %s type, matching useStarlarkThread, "
                     + "but was %s",
                 currentIndex,
-                ENVIRONMENT,
+                STARLARK_THREAD,
                 methodSignatureParams.get(currentIndex).asType().toString()));
       }
       currentIndex++;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index 08c71f5..370ccd6 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -162,14 +162,15 @@
   }
 
   /**
-   * Is this class known to be *recursively* immutable by Skylark?
-   * For instance, class Tuple is not it, because it can contain mutable values.
+   * Is this class known to be *recursively* immutable by Skylark? For instance, class Tuple is not
+   * it, because it can contain mutable values.
+   *
    * @param c a Class
    * @return true if the class is known to represent only recursively immutable values.
    */
   // NB: This is used as the basis for accepting objects in SkylarkNestedSet-s,
   // as well as for accepting objects as keys for Skylark dict-s.
-  static boolean isImmutable(Class<?> c) {
+  private static boolean isImmutable(Class<?> c) {
     return c.isAnnotationPresent(Immutable.class) // TODO(bazel-team): beware of containers!
         || c.equals(String.class)
         || c.equals(Integer.class)
@@ -184,6 +185,7 @@
         || c.equals(String.class) // basic values
         || c.equals(Integer.class)
         || c.equals(Boolean.class)
+        // TODO(adonovan): delete those below, and order those above by cost.
         // there is a registered Skylark ancestor class (useful e.g. when using AutoValue)
         || SkylarkInterfaceUtils.getSkylarkModule(c) != null
         || ImmutableMap.class.isAssignableFrom(c); // will be converted to SkylarkDict
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index a81b058..6d6758c 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
@@ -1232,7 +1233,7 @@
               + "100 % -7  # -5 (unlike in some other languages)\n"
               + "int(\"18\")\n"
               + "</pre>")
-  public static final class IntModule {}
+  static final class IntModule implements SkylarkValue {} // (documentation only)
 
   /** Skylark bool type. */
   @SkylarkModule(
@@ -1244,7 +1245,7 @@
               + "<a href=\"globals.html#False\">False</a>. "
               + "Any value can be converted to a boolean using the "
               + "<a href=\"globals.html#bool\">bool</a> function.")
-  public static final class BoolModule {}
+  static final class BoolModule implements SkylarkValue {} // (documentation only)
 
   /** Adds bindings for all the builtin functions of this class to the given map builder. */
   public static void addBindingsToBuilder(ImmutableMap.Builder<String, Object> builder) {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java b/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java
index ef57182..3c3e6f6 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StringModule.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import java.util.ArrayList;
@@ -43,30 +44,29 @@
  * 'String self' parameter as the first parameter of the method.
  */
 @SkylarkModule(
-  name = "string",
-  category = SkylarkModuleCategory.BUILTIN,
-  doc =
-      "A language built-in type to support strings. "
-          + "Examples of string literals:<br>"
-          + "<pre class=\"language-python\">a = 'abc\\ndef'\n"
-          + "b = \"ab'cd\"\n"
-          + "c = \"\"\"multiline string\"\"\"\n"
-          + "\n"
-          + "# Strings support slicing (negative index starts from the end):\n"
-          + "x = \"hello\"[2:4]  # \"ll\"\n"
-          + "y = \"hello\"[1:-1]  # \"ell\"\n"
-          + "z = \"hello\"[:4]  # \"hell\""
-          + "# Slice steps can be used, too:\n"
-          + "s = \"hello\"[::2] # \"hlo\"\n"
-          + "t = \"hello\"[3:0:-1] # \"lle\"\n</pre>"
-          + "Strings are iterable and support the <code>in</code> operator. Examples:<br>"
-          + "<pre class=\"language-python\">\"bc\" in \"abcd\"   # evaluates to True\n"
-          + "x = [s for s in \"abc\"]  # x == [\"a\", \"b\", \"c\"]</pre>\n"
-          + "Implicit concatenation of strings is not allowed; use the <code>+</code> "
-          + "operator instead. Comparison operators perform a lexicographical comparison; "
-          + "use <code>==</code> to test for equality."
-)
-public final class StringModule {
+    name = "string",
+    category = SkylarkModuleCategory.BUILTIN,
+    doc =
+        "A language built-in type to support strings. "
+            + "Examples of string literals:<br>"
+            + "<pre class=\"language-python\">a = 'abc\\ndef'\n"
+            + "b = \"ab'cd\"\n"
+            + "c = \"\"\"multiline string\"\"\"\n"
+            + "\n"
+            + "# Strings support slicing (negative index starts from the end):\n"
+            + "x = \"hello\"[2:4]  # \"ll\"\n"
+            + "y = \"hello\"[1:-1]  # \"ell\"\n"
+            + "z = \"hello\"[:4]  # \"hell\""
+            + "# Slice steps can be used, too:\n"
+            + "s = \"hello\"[::2] # \"hlo\"\n"
+            + "t = \"hello\"[3:0:-1] # \"lle\"\n</pre>"
+            + "Strings are iterable and support the <code>in</code> operator. Examples:<br>"
+            + "<pre class=\"language-python\">\"bc\" in \"abcd\"   # evaluates to True\n"
+            + "x = [s for s in \"abc\"]  # x == [\"a\", \"b\", \"c\"]</pre>\n"
+            + "Implicit concatenation of strings is not allowed; use the <code>+</code> "
+            + "operator instead. Comparison operators perform a lexicographical comparison; "
+            + "use <code>==</code> to test for equality.")
+public final class StringModule implements SkylarkValue {
 
   private StringModule() {}
 
@@ -1116,5 +1116,5 @@
     return false;
   }
 
-  public static final StringModule INSTANCE = new StringModule();
+  static final StringModule INSTANCE = new StringModule();
 }
diff --git a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
index a4d0c20..05962c2 100644
--- a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -32,9 +33,8 @@
 public final class SkylarkDocumentationFailuresTest {
 
   /** MockClassCommonNameOne */
-  @SkylarkModule(name = "MockClassCommonName",
-      doc = "MockClassCommonName")
-  private static class MockClassCommonNameOne {
+  @SkylarkModule(name = "MockClassCommonName", doc = "MockClassCommonName")
+  private static class MockClassCommonNameOne implements SkylarkValue {
 
     @SkylarkCallable(name = "one", doc = "one")
     public Integer one() {
@@ -43,9 +43,8 @@
   }
 
   /** MockClassCommonNameTwo */
-  @SkylarkModule(name = "MockClassCommonName",
-      doc = "MockClassCommonName")
-  private static class MockClassCommonNameTwo {
+  @SkylarkModule(name = "MockClassCommonName", doc = "MockClassCommonName")
+  private static class MockClassCommonNameTwo implements SkylarkValue {
 
     @SkylarkCallable(name = "two", doc = "two")
     public Integer two() {
@@ -54,9 +53,8 @@
   }
 
   /** PointsToCommonName */
-  @SkylarkModule(name = "PointsToCommonName",
-      doc = "PointsToCommonName")
-  private static class PointsToCommonName {
+  @SkylarkModule(name = "PointsToCommonName", doc = "PointsToCommonName")
+  private static class PointsToCommonName implements SkylarkValue {
     @SkylarkCallable(name = "one", doc = "one")
     public MockClassCommonNameOne getOne() {
       return null;
diff --git a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
index f312932..2d89c1a 100644
--- a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
@@ -95,7 +96,7 @@
 
   /** MockClassA */
   @SkylarkModule(name = "MockClassA", doc = "MockClassA")
-  private static class MockClassA {
+  private static class MockClassA implements SkylarkValue {
     @SkylarkCallable(name = "get", doc = "MockClassA#get")
     public Integer get() {
       return 0;
@@ -104,7 +105,7 @@
 
   /** MockClassD */
   @SkylarkModule(name = "MockClassD", doc = "MockClassD")
-  private static class MockClassD {
+  private static class MockClassD implements SkylarkValue {
     @SkylarkCallable(
       name = "test",
       doc = "MockClassD#test",
@@ -131,7 +132,7 @@
 
   /** MockClassF */
   @SkylarkModule(name = "MockClassF", doc = "MockClassF")
-  private static class MockClassF {
+  private static class MockClassF implements SkylarkValue {
     @SkylarkCallable(
       name = "test",
       doc = "MockClassF#test",
@@ -150,7 +151,7 @@
 
   /** MockClassG */
   @SkylarkModule(name = "MockClassG", doc = "MockClassG")
-  private static class MockClassG {
+  private static class MockClassG implements SkylarkValue {
     @SkylarkCallable(
       name = "test",
       doc = "MockClassG#test",
@@ -169,7 +170,7 @@
 
   /** MockClassH */
   @SkylarkModule(name = "MockClassH", doc = "MockClassH")
-  private static class MockClassH {
+  private static class MockClassH implements SkylarkValue {
     @SkylarkCallable(
       name = "test",
       doc = "MockClassH#test",
@@ -216,7 +217,7 @@
   @SkylarkModule(
       name = "MockClassWithContainerReturnValues",
       doc = "MockClassWithContainerReturnValues")
-  private static class MockClassWithContainerReturnValues {
+  private static class MockClassWithContainerReturnValues implements SkylarkValue {
 
     @SkylarkCallable(name = "depset", doc = "depset")
     public SkylarkNestedSet /*<Integer>*/ getNestedSet() {
@@ -245,9 +246,8 @@
   }
 
   /** MockClassCommonNameOne */
-  @SkylarkModule(name = "MockClassCommonName",
-      doc = "MockClassCommonName")
-  private static class MockClassCommonNameOne {
+  @SkylarkModule(name = "MockClassCommonName", doc = "MockClassCommonName")
+  private static class MockClassCommonNameOne implements SkylarkValue {
 
     @SkylarkCallable(name = "one", doc = "one")
     public Integer one() {
@@ -267,9 +267,10 @@
   }
 
   /** PointsToCommonNameOneWithSubclass */
-  @SkylarkModule(name = "PointsToCommonNameOneWithSubclass",
+  @SkylarkModule(
+      name = "PointsToCommonNameOneWithSubclass",
       doc = "PointsToCommonNameOneWithSubclass")
-  private static class PointsToCommonNameOneWithSubclass {
+  private static class PointsToCommonNameOneWithSubclass implements SkylarkValue {
     @SkylarkCallable(name = "one", doc = "one")
     public MockClassCommonNameOne getOne() {
       return null;
@@ -282,10 +283,8 @@
   }
 
   /** MockClassCommonNameOneUndocumented */
-  @SkylarkModule(name = "MockClassCommonName",
-      documented = false,
-      doc = "")
-  private static class MockClassCommonNameUndocumented {
+  @SkylarkModule(name = "MockClassCommonName", documented = false, doc = "")
+  private static class MockClassCommonNameUndocumented implements SkylarkValue {
 
     @SkylarkCallable(name = "two", doc = "two")
     public Integer two() {
@@ -294,9 +293,10 @@
   }
 
   /** PointsToCommonNameAndUndocumentedModule */
-  @SkylarkModule(name = "PointsToCommonNameAndUndocumentedModule",
+  @SkylarkModule(
+      name = "PointsToCommonNameAndUndocumentedModule",
       doc = "PointsToCommonNameAndUndocumentedModule")
-  private static class PointsToCommonNameAndUndocumentedModule {
+  private static class PointsToCommonNameAndUndocumentedModule implements SkylarkValue {
     @SkylarkCallable(name = "one", doc = "one")
     public MockClassCommonNameOne getOne() {
       return null;
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
index ee74719..400594a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisCachingTest.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.skyframe.AspectValue;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.testutil.Suite;
 import com.google.devtools.build.lib.testutil.TestConstants.InternalTestExecutionMode;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -601,7 +602,8 @@
   }
 
   @SkylarkModule(name = "test_diff_fragment", doc = "fragment for testing differy fragments")
-  private static final class DiffResetFragment extends BuildConfiguration.Fragment {}
+  private static final class DiffResetFragment extends BuildConfiguration.Fragment
+      implements SkylarkValue {}
 
   private static final class DiffResetFactory implements ConfigurationFragmentFactory {
     @Override
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index e22f62e..b92c36e 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -35,6 +35,7 @@
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -309,5 +310,5 @@
   }
 
   @SkylarkModule(name = "test_fragment", doc = "test fragment")
-  private static final class TestFragment {}
+  private static final class TestFragment implements SkylarkValue {}
 }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
index 93b4d04..f196288 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,13 +35,13 @@
 public final class ConfigurationFragmentPolicyTest {
 
   @SkylarkModule(name = "test_fragment", doc = "first fragment")
-  private static final class TestFragment {}
+  private static final class TestFragment implements SkylarkValue {}
 
   @SkylarkModule(name = "other_fragment", doc = "second fragment")
-  private static final class OtherFragment {}
+  private static final class OtherFragment implements SkylarkValue {}
 
   @SkylarkModule(name = "unknown_fragment", doc = "useless waste of permgen")
-  private static final class UnknownFragment {}
+  private static final class UnknownFragment implements SkylarkValue {}
 
   @Test
   public void testMissingFragmentPolicy() throws Exception {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
index 953363c..783b58b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/trimming/TrimmableTestConfigurationFragments.java
@@ -60,6 +60,7 @@
 import com.google.devtools.build.lib.rules.repository.BindRule;
 import com.google.devtools.build.lib.rules.repository.WorkspaceBaseRule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -445,7 +446,7 @@
 
   /** Test configuration fragment. */
   @SkylarkModule(name = "alpha", doc = "Test config fragment.")
-  public static final class AConfig extends BuildConfiguration.Fragment {
+  public static final class AConfig extends BuildConfiguration.Fragment implements SkylarkValue {
     public static final ConfigurationFragmentFactory FACTORY =
         new FragmentLoader<>(
             AConfig.class, AOptions.class, (options) -> new AConfig(options.alpha));
@@ -474,7 +475,7 @@
 
   /** Test configuration fragment. */
   @SkylarkModule(name = "bravo", doc = "Test config fragment.")
-  public static final class BConfig extends BuildConfiguration.Fragment {
+  public static final class BConfig extends BuildConfiguration.Fragment implements SkylarkValue {
     public static final ConfigurationFragmentFactory FACTORY =
         new FragmentLoader<>(
             BConfig.class, BOptions.class, (options) -> new BConfig(options.bravo));
@@ -503,7 +504,7 @@
 
   /** Test configuration fragment. */
   @SkylarkModule(name = "charlie", doc = "Test config fragment.")
-  public static final class CConfig extends BuildConfiguration.Fragment {
+  public static final class CConfig extends BuildConfiguration.Fragment implements SkylarkValue {
     public static final ConfigurationFragmentFactory FACTORY =
         new FragmentLoader<>(
             CConfig.class, COptions.class, (options) -> new CConfig(options.charlie));
@@ -532,7 +533,7 @@
 
   /** Test configuration fragment. */
   @SkylarkModule(name = "delta", doc = "Test config fragment.")
-  public static final class DConfig extends BuildConfiguration.Fragment {
+  public static final class DConfig extends BuildConfiguration.Fragment implements SkylarkValue {
     public static final ConfigurationFragmentFactory FACTORY =
         new FragmentLoader<>(
             DConfig.class, DOptions.class, (options) -> new DConfig(options.delta));
@@ -564,7 +565,7 @@
 
   /** Test configuration fragment. */
   @SkylarkModule(name = "echo", doc = "Test config fragment.")
-  public static final class EConfig extends BuildConfiguration.Fragment {
+  public static final class EConfig extends BuildConfiguration.Fragment implements SkylarkValue {
     public static final ConfigurationFragmentFactory FACTORY =
         new FragmentLoader<>(EConfig.class, EOptions.class, (options) -> new EConfig(options.echo));
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
index 1aad801..898c6fe 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
@@ -387,4 +387,16 @@
             "Expected type 'Object' but got type 'java.lang.String' "
                 + "for noneable parameter 'aParameter'.");
   }
+
+  @Test
+  public void testDoesntImplementSkylarkValue() throws Exception {
+    assertAbout(javaSource())
+        .that(getFile("DoesntImplementSkylarkValue.java"))
+        .processedWith(new SkylarkCallableProcessor())
+        .failsToCompile()
+        .withErrorContaining(
+            "method x has @SkylarkCallable annotation but enclosing class"
+                + " DoesntImplementSkylarkValue does not implement SkylarkValue nor has"
+                + " @SkylarkGlobalLibrary annotation");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ArgumentMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ArgumentMissing.java
index 9265adc..fcfdb32 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ArgumentMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ArgumentMissing.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has no arguments when the annotation indicates it
  * should.
  */
-public class ArgumentMissing {
+public class ArgumentMissing implements SkylarkValue {
 
   @SkylarkCallable(
     name = "method_with_params",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java
index e721402..028841c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ConflictingMethodNames.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
- * Test case for a class which contains multiple SkylarkCallable methods with the same name.
- * This should cause a compile failure -- overrides are not allowed.
+ * Test case for a class which contains multiple SkylarkCallable methods with the same name. This
+ * should cause a compile failure -- overrides are not allowed.
  */
-public class ConflictingMethodNames {
+public class ConflictingMethodNames implements SkylarkValue {
 
   @SkylarkCallable(
       name = "conflicting_method",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DisabledValueParamNoToggle.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DisabledValueParamNoToggle.java
index 16e4edb..2ea9c46 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DisabledValueParamNoToggle.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DisabledValueParamNoToggle.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter which has a "disabled value" set but
  * is always-on.
  */
-public class DisabledValueParamNoToggle {
+public class DisabledValueParamNoToggle implements SkylarkValue {
 
   @SkylarkCallable(
       name = "no_toggle_method",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DocumentationMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DocumentationMissing.java
index 5efd975..8778472 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DocumentationMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DocumentationMissing.java
@@ -15,12 +15,13 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has no documentation and is not explicitly marked
  * "documented=false".
  */
-public class DocumentationMissing {
+public class DocumentationMissing implements SkylarkValue {
 
   @SkylarkCallable(name = "undocumented_method")
   public String undocumentedMethod() {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java
new file mode 100644
index 0000000..16c7cf3
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/DoesntImplementSkylarkValue.java
@@ -0,0 +1,25 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+
+/** A SkylarkCallable-annotated method whose class doesn't implement SkylarkValue. */
+class DoesntImplementSkylarkValue {
+  @SkylarkCallable(name = "x", documented = false)
+  public Object x() {
+    return null;
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
index 1200f7f..b3d4618 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has both enablingFlag and disablingFlag specified.
  */
-public class EnablingAndDisablingFlag {
+public class EnablingAndDisablingFlag implements SkylarkValue {
 
   @SkylarkCallable(
       name = "someMethod",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
index 43db843..27d2820 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
@@ -16,13 +16,14 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter with both enableOnlyWithFlag and
  * disableWithFlag specified.
  */
-public class EnablingAndDisablingFlagParam {
+public class EnablingAndDisablingFlagParam implements SkylarkValue {
 
   @SkylarkCallable(
       name = "someMethod",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
index 69d4d91..c46a66e 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
@@ -24,7 +25,7 @@
  * Test case for a SkylarkCallable method which specifies extraKeywords, but specifies the argument
  * out of order.
  */
-public class ExtraKeywordsOutOfOrder {
+public class ExtraKeywordsOutOfOrder implements SkylarkValue {
 
   @SkylarkCallable(
       name = "extra_kwargs_out_of_order",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
index 55c7dd6..038c007 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
@@ -17,12 +17,13 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
  * Test case for a SkylarkCallable method which specifies extraPositionals, but omits that argument.
  */
-public class ExtraPositionalsMissing {
+public class ExtraPositionalsMissing implements SkylarkValue {
 
   @SkylarkCallable(
       name = "extra_positionals_missing",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
index de7f3f1..a3200bf 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
@@ -18,16 +18,15 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
-/**
- * Test source file verifying various proper uses of SkylarkCallable.
- */
-public class GoldenCase {
+/** Test source file verifying various proper uses of SkylarkCallable. */
+public class GoldenCase implements SkylarkValue {
 
   @SkylarkCallable(
     name = "struct_field_method",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidNoneableParameter.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidNoneableParameter.java
index 69fbb36..b96f94b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidNoneableParameter.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidNoneableParameter.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter with both type and allowedTypes
  * specified.
  */
-public class InvalidNoneableParameter {
+public class InvalidNoneableParameter implements SkylarkValue {
 
   @SkylarkCallable(
       name = "invalid_noneable_parameter",
@@ -32,4 +33,5 @@
   public Integer invalidNoneableParameter(String aParameter) {
     return 42;
   }
+
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidParamNoneDefault.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidParamNoneDefault.java
index a34cb5c..57767c6 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidParamNoneDefault.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/InvalidParamNoneDefault.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
- * Test case for a SkylarkCallable method which has a parameter with "None" set as the default,
- * but noneable is not true.
+ * Test case for a SkylarkCallable method which has a parameter with "None" set as the default, but
+ * noneable is not true.
  */
-public class InvalidParamNoneDefault {
+public class InvalidParamNoneDefault implements SkylarkValue {
 
   @SkylarkCallable(
       name = "method_with_invalid_default",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java
index fcac8b0..458c56c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java
@@ -16,13 +16,14 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
  * Test case for a SkylarkCallable method which does not have an appropriate StarlarkThread
  * parameter despite having useLocation set.
  */
-public class LocationMissing {
+public class LocationMissing implements SkylarkValue {
 
   @SkylarkCallable(
       name = "three_arg_method_missing_location",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/MultipleSelfCallMethods.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/MultipleSelfCallMethods.java
index 674df67..65fca81 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/MultipleSelfCallMethods.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/MultipleSelfCallMethods.java
@@ -16,11 +16,10 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Test case for a class with multiple SkylarkCallable methods which have selfCall=true.
- */
-public class MultipleSelfCallMethods {
+/** Test case for a class with multiple SkylarkCallable methods which have selfCall=true. */
+public class MultipleSelfCallMethods implements SkylarkValue {
 
   @SkylarkCallable(
       name = "selfCallMethod",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/NonDefaultParamAfterDefault.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/NonDefaultParamAfterDefault.java
index 3e736f8..98bb529 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/NonDefaultParamAfterDefault.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/NonDefaultParamAfterDefault.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a positional parameter with no default value
  * specified after a positional parameter with a default value.
  */
-public class NonDefaultParamAfterDefault {
+public class NonDefaultParamAfterDefault implements SkylarkValue {
 
   @SkylarkCallable(
       name = "non_default_after_default",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamNeitherNamedNorPositional.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamNeitherNamedNorPositional.java
index 7c7bb1c..b02234b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamNeitherNamedNorPositional.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamNeitherNamedNorPositional.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter with is neither named nor
  * positional.
  */
-public class ParamNeitherNamedNorPositional {
+public class ParamNeitherNamedNorPositional implements SkylarkValue {
 
   @SkylarkCallable(
       name = "param_neither_named_nor_positional",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamTypeConflict.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamTypeConflict.java
index a3b601d..86669e6 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamTypeConflict.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ParamTypeConflict.java
@@ -17,12 +17,13 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter with both type and allowedTypes
  * specified.
  */
-public class ParamTypeConflict {
+public class ParamTypeConflict implements SkylarkValue {
 
   @SkylarkCallable(
     name = "param_type_conflict",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalOnlyParamAfterNamed.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalOnlyParamAfterNamed.java
index 74ae4ea..6485738 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalOnlyParamAfterNamed.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalOnlyParamAfterNamed.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has a positional-only parameter specified after a
  * named positional parameter.
  */
-public class PositionalOnlyParamAfterNamed {
+public class PositionalOnlyParamAfterNamed implements SkylarkValue {
 
   @SkylarkCallable(
       name = "positional_only_after_named",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalParamAfterNonPositional.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalParamAfterNonPositional.java
index 713f52e..1ee618a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalParamAfterNonPositional.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PositionalParamAfterNonPositional.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
- * Test case for a SkylarkCallable method which has a positional parameter specified after a
- * non positional parameter.
+ * Test case for a SkylarkCallable method which has a positional parameter specified after a non
+ * positional parameter.
  */
-public class PositionalParamAfterNonPositional {
+public class PositionalParamAfterNonPositional implements SkylarkValue {
 
   @SkylarkCallable(
       name = "positional_after_non_positional",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PrivateMethod.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PrivateMethod.java
index 88d2c14..369f98c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PrivateMethod.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/PrivateMethod.java
@@ -15,11 +15,10 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Test case which verifies a method annotated with SkylarkCallable cannot be private.
- */
-public class PrivateMethod {
+/** Test case which verifies a method annotated with SkylarkCallable cannot be private. */
+public class PrivateMethod implements SkylarkValue {
 
   @SkylarkCallable(name = "private_method", doc = "A private method")
   private String privateMethod() {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithNoName.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithNoName.java
index 769600d..4b17a3c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithNoName.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithNoName.java
@@ -15,11 +15,10 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Test case for a class with a SkylarkCallable method which has selfCall=true but no name.
- */
-public class SelfCallWithNoName {
+/** Test case for a class with a SkylarkCallable method which has selfCall=true but no name. */
+public class SelfCallWithNoName implements SkylarkValue {
 
   @SkylarkCallable(
       name = "",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithStructField.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithStructField.java
index e096bf5..a3f76b5 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithStructField.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SelfCallWithStructField.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
- * Test case for a class with a SkylarkCallable method which has selfCall=true and
- * structField=true.
+ * Test case for a class with a SkylarkCallable method which has selfCall=true and structField=true.
  */
-public class SelfCallWithStructField {
+public class SelfCallWithStructField implements SkylarkValue {
 
   @SkylarkCallable(
       name = "selfCallMethod",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
index 9eeed84..f0545f5 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
@@ -17,13 +17,14 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
  * Test case for a SkylarkCallable method which specifies skylark-info parameters (for example
  * StarlarkThread) before other parameters.
  */
-public class SkylarkInfoBeforeParams {
+public class SkylarkInfoBeforeParams implements SkylarkValue {
 
   @SkylarkCallable(
       name = "skylark_info_wrong_order",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java
index 770d944..721d78a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java
@@ -17,13 +17,14 @@
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
  * Test case for a SkylarkCallable method which specifies skylark-info parameters in the incorrect
  * relative order.
  */
-public class SkylarkInfoParamsWrongOrder {
+public class SkylarkInfoParamsWrongOrder implements SkylarkValue {
 
   @SkylarkCallable(
       name = "skylark_info_params_wrong_order",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SpecifiedGenericType.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SpecifiedGenericType.java
index c852451..0d0755c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SpecifiedGenericType.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SpecifiedGenericType.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 
@@ -24,7 +25,7 @@
  * type. (Parameters, if generic, may only have wildcards, as the types of these parameters must be
  * validated dynamically.)
  */
-public class SpecifiedGenericType {
+public class SpecifiedGenericType implements SkylarkValue {
 
   @SkylarkCallable(
       name = "specified_generic_type",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkThreadMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkThreadMissing.java
index 21e4021..76ed47e 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkThreadMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StarlarkThreadMissing.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which does not have an appropriate StarlarkThread
  * parameter despite having useStarlarkThread set.
  */
-public class StarlarkThreadMissing {
+public class StarlarkThreadMissing implements SkylarkValue {
 
   @SkylarkCallable(
       name = "three_arg_method_missing_env",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StaticMethod.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StaticMethod.java
index fd0e498..b929c9a 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StaticMethod.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StaticMethod.java
@@ -15,11 +15,10 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Test case which verifies a method annotated with SkylarkCallable cannot be static.
- */
-public class StaticMethod {
+/** Test case which verifies a method annotated with SkylarkCallable cannot be static. */
+public class StaticMethod implements SkylarkValue {
 
   @SkylarkCallable(name = "private_method", doc = "A private method")
   public static String staticMethod() {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithArguments.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithArguments.java
index 9ec6166..eaadbcc 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithArguments.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithArguments.java
@@ -16,11 +16,10 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
-/**
- * Test case which verifies a struct field method cannot have arguments.
- */
-public class StructFieldWithArguments {
+/** Test case which verifies a struct field method cannot have arguments. */
+public class StructFieldWithArguments implements SkylarkValue {
 
   @SkylarkCallable(name = "struct_field_method",
       parameters = {
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraArgs.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraArgs.java
index 8c8c508..1472480 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraArgs.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraArgs.java
@@ -16,10 +16,11 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 
 /** Test case which verifies a struct field method cannot specify extraArgs. */
-public class StructFieldWithExtraArgs {
+public class StructFieldWithExtraArgs implements SkylarkValue {
 
   @SkylarkCallable(
     name = "struct_field_method_with_extra_args",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraKeywords.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraKeywords.java
index 9055172..a98f7dc 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraKeywords.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithExtraKeywords.java
@@ -16,10 +16,11 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 
 /** Test case which verifies a struct field method cannot specify extraArgs. */
-public class StructFieldWithExtraKeywords {
+public class StructFieldWithExtraKeywords implements SkylarkValue {
 
   @SkylarkCallable(
     name = "struct_field_method_with_extra_kwargs",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithInvalidInfo.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithInvalidInfo.java
index 0bab6a8..4d77ae6 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithInvalidInfo.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/StructFieldWithInvalidInfo.java
@@ -15,10 +15,11 @@
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 
 /** Test case which verifies a struct field method cannot specify useStarlarkThread. */
-public class StructFieldWithInvalidInfo {
+public class StructFieldWithInvalidInfo implements SkylarkValue {
 
   @SkylarkCallable(
     name = "struct_field_method_with_info",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
index 63e9638..d0eded9 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
@@ -25,7 +26,7 @@
  * Test case for a SkylarkCallable method which has a "extraKeywords" parameter which has
  * enableOnlyWithFlag set. (This is unsupported.)
  */
-public class ToggledKwargsParam {
+public class ToggledKwargsParam implements SkylarkValue {
 
   @SkylarkCallable(
       name = "toggled_kwargs_method",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
index ed2d8d3..e75acee 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
@@ -16,13 +16,14 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter which may be disabled with semantic
  * flag but has no "disabled value".
  */
-public class ToggledParamNoDisabledValue {
+public class ToggledParamNoDisabledValue implements SkylarkValue {
 
   @SkylarkCallable(
       name = "no_disabled_value_method",
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/TooManyArguments.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/TooManyArguments.java
index 2c6e17f..cd0540b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/TooManyArguments.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/TooManyArguments.java
@@ -16,12 +16,13 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 
 /**
  * Test case for a SkylarkCallable method which has more arguments than are declared by the
  * annotation.
  */
-public class TooManyArguments {
+public class TooManyArguments implements SkylarkValue {
 
   @SkylarkCallable(
     name = "method_with_too_many_arguments",
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index a24a691..a834dcb 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -48,8 +48,7 @@
 
   /** MockClassA */
   @SkylarkModule(name = "MockClassA", doc = "MockClassA")
-  public static class MockClassA {
-  }
+  public static class MockClassA implements SkylarkValue {}
 
   /** MockClassB */
   public static class MockClassB extends MockClassA {
@@ -127,11 +126,8 @@
         () -> EvalUtils.SKYLARK_COMPARATOR.compare(Runtime.NONE, Runtime.NONE));
   }
 
-  @SkylarkModule(
-      name = "ParentType",
-      doc = "A parent class annotated with @SkylarkModule."
-  )
-  private static class ParentClassWithSkylarkModule {}
+  @SkylarkModule(name = "ParentType", doc = "A parent class annotated with @SkylarkModule.")
+  private static class ParentClassWithSkylarkModule implements SkylarkValue {}
 
   private static class ChildClass extends ParentClassWithSkylarkModule {}
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index 5ca992a..d1756bc 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import org.junit.Before;
 import org.junit.Test;
@@ -176,7 +177,7 @@
   }
 
   @SkylarkModule(name = "AStruct", documented = false, doc = "")
-  static final class AStruct implements ClassObject {
+  static final class AStruct implements ClassObject, SkylarkValue {
     @Override
     public Object getValue(String name) {
       switch (name) {
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 3287dcc..829bdc1 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -126,7 +126,7 @@
   }
 
   @SkylarkModule(name = "Mock", doc = "")
-  static class Mock {
+  static class Mock implements SkylarkValue {
     @SkylarkCallable(
         name = "MockFn",
         selfCall = true,
@@ -513,7 +513,7 @@
   }
 
   @SkylarkModule(name = "MockInterface", doc = "")
-  static interface MockInterface {
+  static interface MockInterface extends SkylarkValue {
     @SkylarkCallable(name = "is_empty_interface",
         parameters = { @Param(name = "str", type = String.class) },
         documented = false)
@@ -533,7 +533,7 @@
   }
 
   @SkylarkModule(name = "MockClassObject", documented = false, doc = "")
-  static final class MockClassObject implements ClassObject {
+  static final class MockClassObject implements ClassObject, SkylarkValue {
     @Override
     public Object getValue(String name) {
       switch (name) {
@@ -555,7 +555,7 @@
   }
 
   @SkylarkModule(name = "ParamterizedMock", doc = "")
-  static interface ParameterizedApi<ObjectT> {
+  static interface ParameterizedApi<ObjectT> extends SkylarkValue {
     @SkylarkCallable(
         name = "method",
         documented = false,
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
index f20be49..f2d358a 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkInterfaceUtilsTest.java
@@ -20,20 +20,19 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import java.lang.reflect.Method;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-/**
- *  Test Skylark interface annotations and utilities.
- */
+/** Test Skylark interface annotations and utilities. */
 @RunWith(JUnit4.class)
 public class SkylarkInterfaceUtilsTest {
 
   /** MockClassA */
   @SkylarkModule(name = "MockClassA", doc = "MockClassA")
-  public static class MockClassA {
+  public static class MockClassA implements SkylarkValue {
     @SkylarkCallable(name = "foo", doc = "MockClassA#foo")
     public void foo() {}
     @SkylarkCallable(name = "bar", doc = "MockClassA#bar")
@@ -43,7 +42,7 @@
 
   /** MockInterfaceB1 */
   @SkylarkModule(name = "MockInterfaceB1", doc = "MockInterfaceB1")
-  public static interface MockInterfaceB1 {
+  public static interface MockInterfaceB1 extends SkylarkValue {
     @SkylarkCallable(name = "foo", doc = "MockInterfaceB1#foo")
     void foo();
     @SkylarkCallable(name = "bar", doc = "MockInterfaceB1#bar")
@@ -54,7 +53,7 @@
 
   /** MockInterfaceB2 */
   @SkylarkModule(name = "MockInterfaceB2", doc = "MockInterfaceB2")
-  public static interface MockInterfaceB2 {
+  public static interface MockInterfaceB2 extends SkylarkValue {
     @SkylarkCallable(name = "baz", doc = "MockInterfaceB2#baz")
     void baz();
     @SkylarkCallable(name = "qux", doc = "MockInterfaceB2#qux")
@@ -100,14 +99,14 @@
 
   /** ClassAModule test class */
   @SkylarkModule(name = "ClassAModule", doc = "ClassAModule")
-  public static class ClassAModule {}
+  public static class ClassAModule implements SkylarkValue {}
 
   /** ExtendsClassA test class */
   public static class ExtendsClassA extends ClassAModule {}
 
   /** InterfaceBModule test interface */
   @SkylarkModule(name = "InterfaceBModule", doc = "InterfaceBModule")
-  public static interface InterfaceBModule {}
+  public static interface InterfaceBModule extends SkylarkValue {}
 
   /** ExtendsInterfaceB test interface */
   public static interface ExtendsInterfaceB extends InterfaceBModule {}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkTypeTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkTypeTest.java
index 7e09c96..a30bb36 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkTypeTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -25,11 +26,8 @@
 @RunWith(JUnit4.class)
 public final class SkylarkTypeTest {
 
-  @SkylarkModule(
-      name = "ParentType",
-      doc = "A parent class annotated with @SkylarkModule."
-  )
-  private static class ParentClassWithSkylarkModule {}
+  @SkylarkModule(name = "ParentType", doc = "A parent class annotated with @SkylarkModule.")
+  private static class ParentClassWithSkylarkModule implements SkylarkValue {}
 
   private static class ChildClass extends ParentClassWithSkylarkModule {}
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
index faa7339..04321ad 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
@@ -16,6 +16,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestMode;
@@ -38,7 +39,7 @@
 
   /** Mock containing exposed methods for flag-guarding tests. */
   @SkylarkModule(name = "Mock", doc = "")
-  public static class Mock {
+  public static class Mock implements SkylarkValue {
 
     @SkylarkCallable(
         name = "positionals_only_method",