starlark annot: delete Param.type and Param.noneable

They are redundant wrt allowedTypes, and create inconsistency/confusion.

BUG=168743413
PiperOrigin-RevId: 337936296
diff --git a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkParamDoc.java b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkParamDoc.java
index 48b2132..2eafd05 100644
--- a/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkParamDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/starlark/StarlarkParamDoc.java
@@ -27,38 +27,29 @@
   }
 
   /**
-   * Returns the string representing the type of this parameter with the link to the
-   * documentation for the type if available.
+   * Returns the string representing the type of this parameter with the link to the documentation
+   * for the type if available.
    *
-   * <p>If the parameter type is Object, then returns the empty string. If the parameter
-   * type is not a generic, then this method returns a string representing the type name
-   * with a link to the documentation for the type if available. If the parameter type
-   * is a generic, then this method returns a string "CONTAINER of TYPE".
+   * <p>If the parameter type is Object, then returns the empty string. If the parameter type is not
+   * a generic, then this method returns a string representing the type name with a link to the
+   * documentation for the type if available. If the parameter type is a generic, then this method
+   * returns a string "CONTAINER of TYPE" (with HTML link markup).
    */
   public String getType() {
-    if (param.type().equals(Object.class)) {
-      StringBuilder sb = new StringBuilder();
-      for (int i = 0; i < param.allowedTypes().length; i++) {
-        ParamType paramType = param.allowedTypes()[i];
-        // Use the paramType's generic class if provided, otherwise the param's generic class
-        Class<?> generic =
-            paramType.generic1() == Object.class ? param.generic1() : paramType.generic1();
-        if (generic.equals(Object.class)) {
-          sb.append(getTypeAnchor(paramType.type()));
-        } else {
-          sb.append(getTypeAnchor(paramType.type(), generic));
-        }
-        if (i < param.allowedTypes().length - 1) {
-          sb.append("; or ");
-        }
+    StringBuilder sb = new StringBuilder();
+    for (int i = 0; i < param.allowedTypes().length; i++) {
+      ParamType paramType = param.allowedTypes()[i];
+      // TODO(adonovan): make generic1 an array.
+      if (paramType.generic1() == Object.class) {
+        sb.append(getTypeAnchor(paramType.type()));
+      } else {
+        sb.append(getTypeAnchor(paramType.type(), paramType.generic1()));
       }
-      return sb.toString();
+      if (i < param.allowedTypes().length - 1) {
+        sb.append("; or ");
+      }
     }
-    if (param.generic1().equals(Object.class)) {
-      return getTypeAnchor(param.type());
-    } else {
-      return getTypeAnchor(param.type(), param.generic1());
-    }
+    return sb.toString();
   }
 
   public StarlarkMethodDoc getMethod() {
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
index ba2b185..12c1620 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -531,10 +531,7 @@
               + "Label(\"@remapped//wiz:quux\")\n"
               + "</pre>",
       parameters = {
-        @Param(
-            name = "relName",
-            type = String.class,
-            doc = "The label that will be resolved relative to this one.")
+        @Param(name = "relName", doc = "The label that will be resolved relative to this one.")
       },
       useStarlarkThread = true)
   public Label getRelative(String relName, StarlarkThread thread) throws LabelSyntaxException {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
index 856ec0d..9b2bce2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkLibrary.java
@@ -28,6 +28,7 @@
 import java.util.List;
 import java.util.Set;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
@@ -100,11 +101,9 @@
         parameters = {
           @Param(
               name = "x",
-              type = Object.class,
               defaultValue = "None",
               positional = true,
               named = false,
-              noneable = true,
               doc =
                   "A positional parameter distinct from other parameters for legacy support. "
                       + "\n" //
@@ -118,7 +117,6 @@
           // TODO(cparsons): Make 'order' keyword-only.
           @Param(
               name = "order",
-              type = String.class,
               defaultValue = "\"default\"",
               doc =
                   "The traversal strategy for the new depset. See "
@@ -126,24 +124,22 @@
               named = true),
           @Param(
               name = "direct",
-              type = Object.class,
               defaultValue = "None",
               positional = false,
               named = true,
-              noneable = true,
               doc = "A list of <i>direct</i> elements of a depset. "),
           @Param(
               name = "transitive",
               named = true,
               positional = false,
-              type = Sequence.class,
-              generic1 = Depset.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = Depset.class),
+                @ParamType(type = NoneType.class),
+              },
               doc = "A list of depsets whose elements will become indirect elements of the depset.",
               defaultValue = "None"),
           @Param(
               name = "items",
-              type = Object.class,
               defaultValue = "[]",
               positional = false,
               doc =
@@ -177,14 +173,12 @@
         parameters = {
           @Param(
               name = "x",
-              type = Dict.class,
               positional = true,
               doc =
                   "A dict that maps configuration conditions to values. Each key is a label string"
                       + " that identifies a config_setting instance."),
           @Param(
               name = "no_match_error",
-              type = String.class,
               defaultValue = "''",
               doc = "Optional custom error to report if no condition matches.",
               named = true),
@@ -216,24 +210,21 @@
             "Defines a set of related environments that can be tagged onto rules to prevent"
                 + "incompatible rules from depending on each other.",
         parameters = {
-          @Param(
-              name = "name",
-              type = String.class,
-              positional = false,
-              named = true,
-              doc = "The name of the rule."),
+          @Param(name = "name", positional = false, named = true, doc = "The name of the rule."),
           // Both parameter below are lists of label designators
           @Param(
               name = "environments",
-              type = Sequence.class,
-              generic1 = Object.class,
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = Label.class),
+              },
               positional = false,
               named = true,
               doc = "A list of Labels for the environments to be grouped, from the same package."),
           @Param(
               name = "defaults",
-              type = Sequence.class,
-              generic1 = Object.class,
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = Label.class),
+              },
               positional = false,
               named = true,
               doc = "A list of Labels.")
@@ -279,8 +270,7 @@
         parameters = {
           @Param(
               name = "license_strings",
-              type = Sequence.class,
-              generic1 = String.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
               doc = "A list of strings, the names of the licenses used.")
         },
         // Not documented by docgen, as this is only available in BUILD files.
@@ -306,9 +296,7 @@
     @StarlarkMethod(
         name = "distribs",
         doc = "Declare the distribution(s) for the code in the current package.",
-        parameters = {
-          @Param(name = "distribution_strings", type = Object.class, doc = "The distributions.")
-        },
+        parameters = {@Param(name = "distribution_strings", doc = "The distributions.")},
         // Not documented by docgen, as this is only available in BUILD files.
         // TODO(cparsons): Devise a solution to document BUILD functions.
         documented = false,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
index e820c51..4a5468b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
@@ -78,7 +78,7 @@
     @StarlarkMethod(
         name = "FeatureFlagInfo",
         documented = false,
-        parameters = {@Param(name = "value", named = true, type = String.class)},
+        parameters = {@Param(name = "value", named = true)},
         selfCall = true)
     public ConfigFeatureFlagProvider selfcall(String value) {
       return create(value, Predicates.alwaysTrue());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
index c1249cc..f6e9669 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/BootClassPathInfo.java
@@ -26,9 +26,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkThread;
@@ -57,24 +59,16 @@
         doc = "The <code>BootClassPathInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "bootclasspath",
-              positional = false,
-              named = true,
-              type = Sequence.class,
-              defaultValue = "[]"),
-          @Param(
-              name = "auxiliary",
-              positional = false,
-              named = true,
-              type = Sequence.class,
-              defaultValue = "[]"),
+          @Param(name = "bootclasspath", positional = false, named = true, defaultValue = "[]"),
+          @Param(name = "auxiliary", positional = false, named = true, defaultValue = "[]"),
           @Param(
               name = "system",
               positional = false,
               named = true,
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               defaultValue = "None"),
         },
         selfCall = true,
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 df4ca74..7b2c07c 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
@@ -57,7 +57,7 @@
         doc = "The <code>MessageBundleInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(name = "messages", positional = false, named = true, type = Sequence.class),
+          @Param(name = "messages", positional = false, named = true),
         },
         selfCall = true,
         useStarlarkThread = true)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
index b6e6f87..361b86a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/CommandLineArgsApi.java
@@ -21,6 +21,7 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkCallable;
 import net.starlark.java.eval.StarlarkThread;
@@ -135,11 +136,13 @@
                     + "this method."),
         @Param(
             name = "format",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "A format string pattern, to be applied to the stringified version of <code>value"
                     + "</code>.")
@@ -199,11 +202,13 @@
             doc = "The list, tuple, or depset whose items will be appended."),
         @Param(
             name = "map_each",
-            type = StarlarkCallable.class,
+            allowedTypes = {
+              @ParamType(type = StarlarkCallable.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "A function that converts each item to zero or more strings, which may be further "
                     + "processed before appending. If this param is not provided, the standard "
@@ -241,28 +246,31 @@
                     + "not produce any visible output."),
         @Param(
             name = "format_each",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "An optional format string pattern, applied to each string returned by the "
                     + "<code>map_each</code> function. "
                     + "The format string must have exactly one '%s' placeholder."),
         @Param(
             name = "before_each",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "An optional string to append before each argument derived from "
                     + "<code>values</code> is appended."),
         @Param(
             name = "omit_if_empty",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "True",
@@ -274,7 +282,6 @@
                     + "other arguments."),
         @Param(
             name = "uniquify",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
@@ -286,7 +293,6 @@
                     + "multiple items."),
         @Param(
             name = "expand_directories",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "True",
@@ -295,11 +301,13 @@
                     + "of files. This happens before <code>map_each</code> is applied."),
         @Param(
             name = "terminate_with",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "An optional string to append after all other arguments. This string will not be "
                     + "added if <code>omit_if_empty</code> is true (the default) and no other "
@@ -361,7 +369,6 @@
             doc = "The list, tuple, or depset whose items will be joined."),
         @Param(
             name = "join_with",
-            type = String.class,
             named = true,
             positional = false,
             doc =
@@ -370,33 +377,38 @@
                     + "<a href='string.html#join'><code>string.join()</code></a>."),
         @Param(
             name = "map_each",
-            type = StarlarkCallable.class,
+            allowedTypes = {
+              @ParamType(type = StarlarkCallable.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc = "Same as for <a href='#add_all.map_each'><code>add_all</code></a>."),
         @Param(
             name = "format_each",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc = "Same as for <a href='#add_all.format_each'><code>add_all</code></a>."),
         @Param(
             name = "format_joined",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
             doc =
                 "An optional format string pattern applied to the joined string. "
                     + "The format string must have exactly one '%s' placeholder."),
         @Param(
             name = "omit_if_empty",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "True",
@@ -409,14 +421,12 @@
                     + "string (which is the logical join of zero strings)."),
         @Param(
             name = "uniquify",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
             doc = "Same as for <a href='#add_all.uniquify'><code>add_all</code></a>."),
         @Param(
             name = "expand_directories",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "True",
@@ -448,7 +458,6 @@
       parameters = {
         @Param(
             name = "param_file_arg",
-            type = String.class,
             named = true,
             doc =
                 "A format string with a single \"%s\". "
@@ -460,7 +469,6 @@
                     + "contain \"--file=params.txt\"."),
         @Param(
             name = "use_always",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
@@ -477,7 +485,6 @@
       parameters = {
         @Param(
             name = "format",
-            type = String.class,
             named = true,
             doc =
                 "Must be one of:<ul>"
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
index 4335554..9285ca8 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DefaultInfoApi.java
@@ -20,9 +20,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.StarlarkThread;
 
 /** A provider that gives general information about a target's direct and transitive files. */
@@ -101,11 +103,13 @@
         parameters = {
           @Param(
               name = "files",
-              type = Depset.class,
+              allowedTypes = {
+                @ParamType(type = Depset.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               positional = false,
               defaultValue = "None",
-              noneable = true,
               doc =
                   "A <a href='depset.html'><code>depset</code></a> of <a"
                       + " href='File.html'><code>File</code></a> objects representing the default"
@@ -113,32 +117,38 @@
                       + " line. By default it is all predeclared outputs."),
           @Param(
               name = "runfiles",
-              type = RunfilesApi.class,
+              allowedTypes = {
+                @ParamType(type = RunfilesApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               positional = false,
               defaultValue = "None",
-              noneable = true,
               doc =
                   "runfiles descriptor describing the files that this target needs when run "
                       + "(via the <code>run</code> command or as a tool dependency)."),
           @Param(
               name = "data_runfiles",
-              type = RunfilesApi.class,
+              allowedTypes = {
+                @ParamType(type = RunfilesApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               positional = false,
               defaultValue = "None",
-              noneable = true,
               doc =
                   DEPRECATED_RUNFILES_PARAMETER_WARNING
                       + "runfiles descriptor describing the runfiles this target needs to run "
                       + "when it is a dependency via the <code>data</code> attribute."),
           @Param(
               name = "default_runfiles",
-              type = RunfilesApi.class,
+              allowedTypes = {
+                @ParamType(type = RunfilesApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               positional = false,
               defaultValue = "None",
-              noneable = true,
               doc =
                   DEPRECATED_RUNFILES_PARAMETER_WARNING
                       + "runfiles descriptor describing the runfiles this target needs to run "
@@ -146,11 +156,13 @@
                       + "<code>data</code> attribute."),
           @Param(
               name = "executable",
-              type = FileApi.class,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               positional = false,
               defaultValue = "None",
-              noneable = true,
               doc =
                   "If this rule is marked <a"
                       + " href='globals.html#rule.executable'><code>executable</code></a> or <a"
@@ -163,7 +175,6 @@
         useStarlarkThread = true)
     @StarlarkConstructor
     DefaultInfoApi constructor(
-        // TODO(cparsons): Use stricter types when Runfiles.NONE is passed as null.
         Object files,
         Object runfiles,
         Object dataRunfiles,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
index 074dfbf..3cd8d9c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/DirectoryExpander.java
@@ -40,7 +40,6 @@
       parameters = {
         @Param(
             name = "file",
-            type = FileApi.class,
             positional = true,
             named = false,
             doc = "The directory or file to expand."),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
index 86fcd40..d64cc3b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/OutputGroupInfoApi.java
@@ -49,7 +49,6 @@
         extraKeywords =
             @Param(
                 name = "kwargs",
-                type = Dict.class,
                 defaultValue = "{}",
                 doc = "Dictionary of arguments."),
         selfCall = true)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
index 7749582..2096f42 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/RunfilesApi.java
@@ -61,7 +61,6 @@
             name = "other",
             positional = true,
             named = false,
-            type = RunfilesApi.class,
             doc = "The runfiles object to merge into this."),
       })
   RunfilesApi merge(RunfilesApi other);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
index d35fdd2..f746f59 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkActionFactoryApi.java
@@ -23,6 +23,7 @@
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
@@ -57,7 +58,6 @@
       parameters = {
         @Param(
             name = "filename",
-            type = String.class,
             doc =
                 "If no 'sibling' provided, path of the new file, relative "
                     + "to the current package. Otherwise a base name for a file "
@@ -67,8 +67,10 @@
             doc =
                 "A file that lives in the same directory as the newly created file. "
                     + "The file must be in the current package.",
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             positional = false,
             named = true,
             defaultValue = "None")
@@ -86,7 +88,6 @@
       parameters = {
         @Param(
             name = "filename",
-            type = String.class,
             doc =
                 "If no 'sibling' provided, path of the new directory, relative "
                     + "to the current package. Otherwise a base name for a file "
@@ -94,8 +95,10 @@
         @Param(
             name = "sibling",
             doc = "A file that lives in the same directory as the newly declared directory.",
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             positional = false,
             named = true,
             defaultValue = "None")
@@ -115,7 +118,6 @@
       parameters = {
         @Param(
             name = "filename",
-            type = String.class,
             doc =
                 "If no 'sibling' provided, path of the new symlink, relative "
                     + "to the current package. Otherwise a base name for a file "
@@ -123,8 +125,10 @@
         @Param(
             name = "sibling",
             doc = "A file that lives in the same directory as the newly declared symlink.",
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             positional = false,
             named = true,
             defaultValue = "None")
@@ -139,17 +143,15 @@
       parameters = {
         @Param(
             name = "mnemonic",
-            type = String.class,
             named = true,
             positional = false,
             doc = "A one-word description of the action, for example, CppCompile or GoLink."),
         @Param(
             name = "inputs",
             allowedTypes = {
-              @ParamType(type = Sequence.class),
+              @ParamType(type = Sequence.class, generic1 = FileApi.class),
               @ParamType(type = Depset.class),
             },
-            generic1 = FileApi.class,
             named = true,
             positional = false,
             defaultValue = "[]",
@@ -175,24 +177,27 @@
       parameters = {
         @Param(
             name = "output",
-            type = FileApi.class,
             named = true,
             positional = false,
             doc = "The output of this action."),
         @Param(
             name = "target_file",
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
-            noneable = true,
             defaultValue = "None",
             doc = "The File that the output symlink will point to."),
         @Param(
             name = "target_path",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
-            noneable = true,
             defaultValue = "None",
             doc =
                 "(Experimental) The exact path that the output symlink will point to. No "
@@ -200,7 +205,6 @@
                     + "requires setting <code>--experimental_allow_unresolved_symlinks</code>."),
         @Param(
             name = "is_executable",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
@@ -214,10 +218,12 @@
                     + "dangling symlinks might not exist at build time.</p>"),
         @Param(
             name = "progress_message",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
-            noneable = true,
             defaultValue = "None",
             doc = "Progress message to show to the user during the build.")
       })
@@ -237,7 +243,7 @@
               + "the analysis phase. If the file is large and with a lot of static content, "
               + "consider using <a href=\"#expand_template\"><code>expand_template</code></a>.",
       parameters = {
-        @Param(name = "output", type = FileApi.class, doc = "The output file.", named = true),
+        @Param(name = "output", doc = "The output file.", named = true),
         @Param(
             name = "content",
             allowedTypes = {
@@ -251,7 +257,6 @@
             named = true),
         @Param(
             name = "is_executable",
-            type = Boolean.class,
             defaultValue = "False",
             doc = "Whether the output file should be executable.",
             named = true)
@@ -267,18 +272,18 @@
       parameters = {
         @Param(
             name = "outputs",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = FileApi.class),
+            },
             named = true,
             positional = false,
             doc = "List of the output files of the action."),
         @Param(
             name = "inputs",
             allowedTypes = {
-              @ParamType(type = Sequence.class),
+              @ParamType(type = Sequence.class, generic1 = FileApi.class),
               @ParamType(type = Depset.class),
             },
-            generic1 = FileApi.class,
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -287,9 +292,9 @@
             name = "unused_inputs_list",
             allowedTypes = {
               @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
             },
             named = true,
-            noneable = true,
             defaultValue = "None",
             positional = false,
             doc =
@@ -324,8 +329,9 @@
                     + "runfiles that are automatically made available to the action."),
         @Param(
             name = "arguments",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+            },
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -335,16 +341,20 @@
                     + "<a href=\"actions.html#args\"><code>actions.args()</code></a> objects."),
         @Param(
             name = "mnemonic",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = "A one-word description of the action, for example, CppCompile or GoLink."),
         @Param(
             name = "progress_message",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -353,23 +363,26 @@
                     + "for example, \"Compiling foo.cc to create foo.o\"."),
         @Param(
             name = "use_default_shell_env",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = "Whether the action should use the built in shell environment or not."),
         @Param(
             name = "env",
-            type = Dict.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = "Sets the dictionary of environment variables."),
         @Param(
             name = "execution_requirements",
-            type = Dict.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -382,8 +395,10 @@
             // This is technically experimental, so folks shouldn't be too attached,
             // but consider renaming to be more accurate/opaque.
             name = "input_manifests",
-            type = Sequence.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -392,8 +407,10 @@
                     + "they are typically generated by resolve_command."),
         @Param(
             name = "exec_group",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -429,18 +446,16 @@
       parameters = {
         @Param(
             name = "outputs",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             named = true,
             positional = false,
             doc = "List of the output files of the action."),
         @Param(
             name = "inputs",
             allowedTypes = {
-              @ParamType(type = Sequence.class),
+              @ParamType(type = Sequence.class, generic1 = FileApi.class),
               @ParamType(type = Depset.class),
             },
-            generic1 = FileApi.class,
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -448,10 +463,9 @@
         @Param(
             name = "tools",
             allowedTypes = {
-              @ParamType(type = Sequence.class),
+              @ParamType(type = Sequence.class, generic1 = FileApi.class),
               @ParamType(type = Depset.class),
             },
-            generic1 = FileApi.class,
             defaultValue = "unbound",
             named = true,
             positional = false,
@@ -461,9 +475,6 @@
                     + "The list can contain Files or FilesToRunProvider instances."),
         @Param(
             name = "arguments",
-            allowedTypes = {
-              @ParamType(type = Sequence.class),
-            },
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -483,8 +494,10 @@
                     + "parameter may not be used."),
         @Param(
             name = "mnemonic",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -525,8 +538,10 @@
                     + "genrules."),
         @Param(
             name = "progress_message",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -535,23 +550,26 @@
                     + "for example, \"Compiling foo.cc to create foo.o\"."),
         @Param(
             name = "use_default_shell_env",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = "Whether the action should use the built in shell environment or not."),
         @Param(
             name = "env",
-            type = Dict.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = "Sets the dictionary of environment variables."),
         @Param(
             name = "execution_requirements",
-            type = Dict.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -564,8 +582,10 @@
             // This is technically experimental, so folks shouldn't be too attached,
             // but consider renaming to be more accurate/opaque.
             name = "input_manifests",
-            type = Sequence.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -574,8 +594,10 @@
                     + "they are typically generated by resolve_command."),
         @Param(
             name = "exec_group",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -619,25 +641,21 @@
       parameters = {
         @Param(
             name = "template",
-            type = FileApi.class,
             named = true,
             positional = false,
             doc = "The template file, which is a UTF-8 encoded text file."),
         @Param(
             name = "output",
-            type = FileApi.class,
             named = true,
             positional = false,
             doc = "The output file, which is a UTF-8 encoded text file."),
         @Param(
             name = "substitutions",
-            type = Dict.class,
             named = true,
             positional = false,
             doc = "Substitutions to make when expanding the template."),
         @Param(
             name = "is_executable",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
index 5829b3e..3472b2f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkAttrModuleApi.java
@@ -23,6 +23,7 @@
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkFunction;
 import net.starlark.java.eval.StarlarkInt;
@@ -146,29 +147,25 @@
       parameters = {
         @Param(
             name = DEFAULT_ARG,
-            type = StarlarkInt.class,
             defaultValue = "0",
             doc = DEFAULT_DOC,
             named = true,
             positional = false),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = MANDATORY_DOC,
             named = true,
             positional = false),
         @Param(
             name = VALUES_ARG,
-            type = Sequence.class,
-            generic1 = StarlarkInt.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = StarlarkInt.class)},
             defaultValue = "[]",
             doc = VALUES_DOC,
             named = true,
@@ -189,29 +186,27 @@
       parameters = {
         @Param(
             name = DEFAULT_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DEFAULT_DOC,
             named = true,
             positional = false),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = MANDATORY_DOC,
             named = true,
             positional = false),
         @Param(
             name = VALUES_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+            },
             defaultValue = "[]",
             doc = VALUES_DOC,
             named = true,
@@ -248,9 +243,9 @@
               // I suspect it is a vestige of a "computed defaults" feature
               // that was never fully exposed to Starlark (or was since
               // withdrawn).
-              @ParamType(type = StarlarkFunction.class)
+              @ParamType(type = StarlarkFunction.class),
+              @ParamType(type = NoneType.class),
             },
-            noneable = true,
             defaultValue = "None",
             named = true,
             positional = false,
@@ -261,14 +256,12 @@
                     + "<code>attr.label(default = \"//a:b\")</code>."),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = EXECUTABLE_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -278,45 +271,40 @@
             defaultValue = "None",
             named = true,
             positional = false,
-            noneable = true,
             doc = ALLOW_FILES_DOC),
         @Param(
             name = ALLOW_SINGLE_FILE_ARG,
             defaultValue = "None",
             named = true,
             positional = false,
-            noneable = true,
             doc =
                 "This is similar to <code>allow_files</code>, with the restriction that the label "
                     + "must correspond to a single <a href=\"File.html\">File</a>. "
                     + "Access it through <code>ctx.file.&lt;attribute_name&gt;</code>."),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = MANDATORY_DOC),
         @Param(
             name = PROVIDERS_ARG,
-            type = Sequence.class,
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = PROVIDERS_DOC),
         @Param(
             name = ALLOW_RULES_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = ALLOW_RULES_DOC),
         @Param(
             name = CONFIGURATION_ARG,
-            type = Object.class,
-            noneable = true,
             defaultValue = "None",
             named = true,
             positional = false,
@@ -329,8 +317,7 @@
                     + "unless it really helps clarify your intentions."),
         @Param(
             name = ASPECTS_ARG,
-            type = Sequence.class,
-            generic1 = StarlarkAspectApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = StarlarkAspectApi.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -355,33 +342,16 @@
       name = "string_list",
       doc = "Creates a schema for a list-of-strings attribute.",
       parameters = {
-        @Param(
-            name = MANDATORY_ARG,
-            type = Boolean.class,
-            defaultValue = "False",
-            doc = MANDATORY_DOC,
-            named = true),
-        @Param(
-            name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
-            defaultValue = "True",
-            doc = ALLOW_EMPTY_DOC,
-            named = true),
+        @Param(name = MANDATORY_ARG, defaultValue = "False", doc = MANDATORY_DOC, named = true),
+        @Param(name = ALLOW_EMPTY_ARG, defaultValue = "True", doc = ALLOW_EMPTY_DOC, named = true),
         @Param(
             name = DEFAULT_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             doc = DEFAULT_DOC,
             named = true,
             positional = false),
-        @Param(
-            name = DOC_ARG,
-            type = String.class,
-            defaultValue = "''",
-            doc = DOC_DOC,
-            named = true,
-            positional = false)
+        @Param(name = DOC_ARG, defaultValue = "''", doc = DOC_DOC, named = true, positional = false)
       },
       useStarlarkThread = true)
   Descriptor stringListAttribute(
@@ -398,33 +368,16 @@
           "Creates a schema for a list-of-integers attribute. Each element must be in the signed"
               + " 32-bit range.",
       parameters = {
-        @Param(
-            name = MANDATORY_ARG,
-            type = Boolean.class,
-            defaultValue = "False",
-            doc = MANDATORY_DOC,
-            named = true),
-        @Param(
-            name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
-            defaultValue = "True",
-            doc = ALLOW_EMPTY_DOC,
-            named = true),
+        @Param(name = MANDATORY_ARG, defaultValue = "False", doc = MANDATORY_DOC, named = true),
+        @Param(name = ALLOW_EMPTY_ARG, defaultValue = "True", doc = ALLOW_EMPTY_DOC, named = true),
         @Param(
             name = DEFAULT_ARG,
-            type = Sequence.class,
-            generic1 = StarlarkInt.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = StarlarkInt.class)},
             defaultValue = "[]",
             doc = DEFAULT_DOC,
             named = true,
             positional = false),
-        @Param(
-            name = DOC_ARG,
-            type = String.class,
-            defaultValue = "''",
-            doc = DOC_DOC,
-            named = true,
-            positional = false)
+        @Param(name = DOC_ARG, defaultValue = "''", doc = DOC_DOC, named = true, positional = false)
       },
       useStarlarkThread = true)
   Descriptor intListAttribute(
@@ -441,12 +394,7 @@
           "Creates a schema for a list-of-labels attribute. This is a dependency attribute."
               + DEPENDENCY_ATTR_TEXT,
       parameters = {
-        @Param(
-            name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
-            defaultValue = "True",
-            doc = ALLOW_EMPTY_DOC,
-            named = true),
+        @Param(name = ALLOW_EMPTY_ARG, defaultValue = "True", doc = ALLOW_EMPTY_DOC, named = true),
         @Param(
             name = DEFAULT_ARG,
             allowedTypes = {
@@ -463,61 +411,59 @@
                     + "<code>attr.label_list(default = [\"//a:b\", \"//a:c\"])</code>."),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
-            name = ALLOW_FILES_ARG, // bool or FileType filter
+            name = ALLOW_FILES_ARG,
+            allowedTypes = {
+              @ParamType(type = Boolean.class),
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
-            noneable = true,
             doc = ALLOW_FILES_DOC),
         @Param(
             name = ALLOW_RULES_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = ALLOW_RULES_DOC),
         @Param(
             name = PROVIDERS_ARG,
-            type = Sequence.class,
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = PROVIDERS_DOC),
         @Param(
             name = FLAGS_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = FLAGS_DOC),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = MANDATORY_DOC),
         @Param(
             name = CONFIGURATION_ARG,
-            type = Object.class,
-            noneable = true,
             defaultValue = "None",
             named = true,
             positional = false,
             doc = CONFIGURATION_DOC),
         @Param(
             name = ASPECTS_ARG,
-            type = Sequence.class,
-            generic1 = StarlarkAspectApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = StarlarkAspectApi.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -545,12 +491,7 @@
               + "the values are strings. This is a dependency attribute."
               + DEPENDENCY_ATTR_TEXT,
       parameters = {
-        @Param(
-            name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
-            defaultValue = "True",
-            doc = ALLOW_EMPTY_DOC,
-            named = true),
+        @Param(name = ALLOW_EMPTY_ARG, defaultValue = "True", doc = ALLOW_EMPTY_DOC, named = true),
         @Param(
             name = DEFAULT_ARG,
             allowedTypes = {
@@ -568,61 +509,59 @@
                     + "{\"//a:b\": \"value\", \"//a:c\": \"string\"})</code>."),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
-            name = ALLOW_FILES_ARG, // bool or FileType filter
+            name = ALLOW_FILES_ARG,
+            allowedTypes = {
+              @ParamType(type = Boolean.class),
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
-            noneable = true,
             doc = ALLOW_FILES_DOC),
         @Param(
             name = ALLOW_RULES_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
             doc = ALLOW_RULES_DOC),
         @Param(
             name = PROVIDERS_ARG,
-            type = Sequence.class,
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = PROVIDERS_DOC),
         @Param(
             name = FLAGS_ARG,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = FLAGS_DOC),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = MANDATORY_DOC),
         @Param(
             name = CONFIGURATION_ARG,
-            type = Object.class,
-            noneable = true,
             defaultValue = "None",
             named = true,
             positional = false,
             doc = CONFIGURATION_DOC),
         @Param(
             name = ASPECTS_ARG,
-            type = Sequence.class,
-            generic1 = StarlarkAspectApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = StarlarkAspectApi.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -649,21 +588,18 @@
       parameters = {
         @Param(
             name = DEFAULT_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
             doc = DEFAULT_DOC),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -680,14 +616,12 @@
       parameters = {
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -703,20 +637,17 @@
       parameters = {
         @Param(
             name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
             defaultValue = "True",
             doc = ALLOW_EMPTY_DOC,
             named = true),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -735,27 +666,23 @@
       parameters = {
         @Param(
             name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
             defaultValue = "True",
             doc = ALLOW_EMPTY_DOC,
             named = true),
         @Param(
             name = DEFAULT_ARG,
-            type = Dict.class,
             named = true,
             positional = false,
             defaultValue = "{}",
             doc = DEFAULT_DOC),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
@@ -778,27 +705,23 @@
       parameters = {
         @Param(
             name = ALLOW_EMPTY_ARG,
-            type = Boolean.class,
             defaultValue = "True",
             doc = ALLOW_EMPTY_DOC,
             named = true),
         @Param(
             name = DEFAULT_ARG,
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             positional = false,
             doc = DEFAULT_DOC),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -822,20 +745,17 @@
         @Param(
             name = DEFAULT_ARG,
             defaultValue = "None",
-            noneable = true,
             named = true,
             positional = false,
             doc = DEFAULT_DOC),
         @Param(
             name = DOC_ARG,
-            type = String.class,
             defaultValue = "''",
             doc = DOC_DOC,
             named = true,
             positional = false),
         @Param(
             name = MANDATORY_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
index 3e98616..5bd7caa 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkBuildApiGlobals.java
@@ -43,12 +43,10 @@
       parameters = {
         @Param(
             name = "fragment",
-            type = String.class,
             named = true,
             doc = "The name of a configuration fragment which contains the late-bound value."),
         @Param(
             name = "name",
-            type = String.class,
             named = true,
             doc = "The name of the value to obtain from the configuration fragment."),
       },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
index 3bba574..5ffc917 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkCommandLineApi.java
@@ -35,12 +35,8 @@
           "Deprecated. Creates a single command line argument joining the paths of a set "
               + "of files on the separator string.",
       parameters = {
-        @Param(name = "separator", type = String.class, doc = "the separator string to join on."),
-        @Param(
-            name = "files",
-            type = Depset.class,
-            generic1 = FileApi.class,
-            doc = "the files to concatenate.")
+        @Param(name = "separator", doc = "the separator string to join on."),
+        @Param(name = "files", doc = "the files to concatenate.")
       })
   String joinPaths(String separator, Depset files) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
index d2d7ddd..d227442 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkConfigApi.java
@@ -17,8 +17,10 @@
 import com.google.devtools.build.docgen.annot.DocCategory;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -55,7 +57,6 @@
       parameters = {
         @Param(
             name = FLAG_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = FLAG_ARG_DOC,
             named = true,
@@ -69,7 +70,6 @@
       parameters = {
         @Param(
             name = FLAG_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = FLAG_ARG_DOC,
             named = true,
@@ -83,7 +83,6 @@
       parameters = {
         @Param(
             name = FLAG_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = FLAG_ARG_DOC,
             named = true,
@@ -97,7 +96,6 @@
       parameters = {
         @Param(
             name = FLAG_ARG,
-            type = Boolean.class,
             defaultValue = "False",
             doc = FLAG_ARG_DOC,
             named = true,
@@ -122,9 +120,11 @@
       parameters = {
         @Param(
             name = "exec_group",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             defaultValue = "None",
             doc =
                 "The name of the exec group whose execution platform this transition will use. If"
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
index c242578..c3a2470 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkNativeModuleApi.java
@@ -16,6 +16,7 @@
 
 import com.google.devtools.build.docgen.annot.DocCategory;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
@@ -53,15 +54,13 @@
       parameters = {
         @Param(
             name = "include",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             named = true,
             doc = "The list of glob patterns to include."),
         @Param(
             name = "exclude",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             named = true,
             doc = "The list of glob patterns to exclude."),
@@ -73,7 +72,6 @@
             doc = "A flag whether to exclude directories or not."),
         @Param(
             name = "allow_empty",
-            type = Object.class,
             defaultValue = "unbound",
             named = true,
             doc =
@@ -116,7 +114,7 @@
               + " order-dependent. Also, beware that it differs subtly from the two"
               + " other conversions of rule attribute values from internal form to Starlark: one"
               + " used by computed defaults, the other used by <code>ctx.attr.foo</code>.",
-      parameters = {@Param(name = "name", type = String.class, doc = "The name of the target.")},
+      parameters = {@Param(name = "name", doc = "The name of the target.")},
       useStarlarkThread = true)
   Object existingRule(String name, StarlarkThread thread)
       throws EvalException, InterruptedException;
@@ -141,22 +139,21 @@
       parameters = {
         @Param(
             name = "name",
-            type = String.class,
             named = true,
             positional = false,
             doc = "The unique name for this rule."),
         @Param(
             name = "packages",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+            },
             defaultValue = "[]",
             named = true,
             positional = false,
             doc = "A complete enumeration of packages in this group."),
         @Param(
             name = "includes",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             named = true,
             positional = false,
@@ -175,16 +172,16 @@
       parameters = {
         @Param(
             name = "srcs",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc = "The list of files to export."),
-        // TODO(bazel-team): make it possible to express the precise type ListOf(LabelDesignator)
         @Param(
             name = "visibility",
-            type = Sequence.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
-            noneable = true,
             named = true,
             doc =
                 "A visibility declaration can to be specified. The files will be visible to the "
@@ -192,9 +189,10 @@
                     + "to every package."),
         @Param(
             name = "licenses",
-            type = Sequence.class,
-            generic1 = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             defaultValue = "None",
             doc = "Licenses to be specified.")
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
index 4a1aac6..1a1d8cc 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleContextApi.java
@@ -33,6 +33,7 @@
 import net.starlark.java.eval.ClassObject;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
@@ -252,9 +253,11 @@
       parameters = {
         @Param(
             name = "target",
-            type = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = TransitiveInfoCollectionApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
-            noneable = true,
             named = true,
             doc = "A Target specifying a rule. If not provided, defaults to the current rule.")
       })
@@ -326,7 +329,6 @@
             name = "constraintValue",
             positional = true,
             named = false,
-            type = ConstraintValueInfoApi.class,
             doc = "The constraint value to check the target platform against.")
       })
   boolean targetPlatformHasConstraint(ConstraintValueT constraintValue);
@@ -351,7 +353,6 @@
             name = "option",
             positional = true,
             named = false,
-            type = String.class,
             doc = "The string to split."),
       })
   Sequence<String> tokenize(String optionString) throws EvalException;
@@ -369,19 +370,17 @@
             name = "expression",
             positional = true,
             named = false,
-            type = String.class,
             doc = "The string expression to expand."),
         @Param(
             name = "files",
             positional = true,
             named = false,
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             doc = "The list of files."),
         @Param(
             name = "label_resolver",
             positional = true,
             named = false,
-            type = Label.class,
             doc = "The label resolver."),
       })
   String expand(
@@ -440,17 +439,14 @@
       name = "check_placeholders",
       documented = false,
       parameters = {
-        @Param(
-            name = "template",
-            positional = true,
-            named = false,
-            type = String.class,
-            doc = "The template."),
+        @Param(name = "template", positional = true, named = false, doc = "The template."),
         @Param(
             name = "allowed_placeholders",
             positional = true,
             named = false,
-            type = Sequence.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+            },
             doc = "The allowed placeholders."),
       })
   boolean checkPlaceholders(String template, Sequence<?> allowedPlaceholders) // <String>
@@ -477,20 +473,17 @@
             name = "attribute_name",
             positional = true,
             named = false,
-            type = String.class,
             doc = "The attribute name. Used for error reporting."),
         @Param(
             name = "command",
             positional = true,
             named = false,
-            type = String.class,
             doc =
                 "The expression to expand. It can contain references to " + "\"Make variables\"."),
         @Param(
             name = "additional_substitutions",
             positional = true,
             named = false,
-            type = Dict.class,
             doc = "Additional substitutions to make beyond the default make variables."),
       })
   String expandMakeVariables(
@@ -543,11 +536,12 @@
               + " for <code>genrule</code>). In other cases, it is often better to manipulate"
               + " labels directly.",
       parameters = {
-        @Param(name = "input", type = String.class, doc = "String to be expanded."),
+        @Param(name = "input", doc = "String to be expanded."),
         @Param(
             name = "targets",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             defaultValue = "[]",
             named = true,
             doc = "List of targets for additional lookup information."),
@@ -563,8 +557,7 @@
       parameters = {
         @Param(
             name = "files",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             named = true,
             defaultValue = "[]",
             doc = "The list of files to be added to the runfiles."),
@@ -573,9 +566,10 @@
         // Also, allow empty set for init
         @Param(
             name = "transitive_files",
-            type = Depset.class,
-            generic1 = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Depset.class, generic1 = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             doc =
@@ -584,7 +578,6 @@
                     + "default)."),
         @Param(
             name = "collect_data",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -594,7 +587,6 @@
                     + "runfiles from the dependencies in srcs, data and deps attributes."),
         @Param(
             name = "collect_default",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -604,7 +596,6 @@
                     + "runfiles from the dependencies in srcs, data and deps attributes."),
         @Param(
             name = "symlinks",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc =
@@ -613,7 +604,6 @@
                     + "the rules guide."),
         @Param(
             name = "root_symlinks",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc =
@@ -644,22 +634,22 @@
       parameters = {
         @Param(
             name = "command",
-            type = String.class, // string
             defaultValue = "''",
             named = true,
             positional = false,
             doc = "Command to resolve."),
         @Param(
             name = "attribute",
-            type = String.class, // string
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
-            noneable = true,
             named = true,
             positional = false,
             doc = "Name of the associated attribute for which to issue an error, or None."),
         @Param(
             name = "expand_locations",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -668,8 +658,10 @@
                     + " href=\"#expand_location\">ctx.expand_location()</a> for more details."),
         @Param(
             name = "make_variables",
-            type = Dict.class, // dict(string, string)
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class), // <String, String>
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -677,14 +669,14 @@
         @Param(
             name = "tools",
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class),
+            },
             named = true,
             positional = false,
             doc = "List of tools (list of targets)."),
         @Param(
             name = "label_dict",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             positional = false,
@@ -693,7 +685,6 @@
                     + "(a dict of Label : list of Files)."),
         @Param(
             name = "execution_requirements",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             positional = false,
@@ -727,8 +718,9 @@
         @Param(
             name = "tools",
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             named = true,
             positional = false,
             doc = "List of tools (list of targets)."),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
index 3247caa..949a1ee 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/StarlarkRuleFunctionsApi.java
@@ -65,7 +65,6 @@
       parameters = {
         @Param(
             name = "doc",
-            type = String.class,
             named = true,
             defaultValue = "''",
             doc =
@@ -83,9 +82,9 @@
                     + " })</pre></ul>All fields are optional.",
             allowedTypes = {
               @ParamType(type = Sequence.class, generic1 = String.class),
-              @ParamType(type = Dict.class)
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
             },
-            noneable = true,
             named = true,
             positional = false,
             defaultValue = "None")
@@ -105,7 +104,6 @@
       parameters = {
         @Param(
             name = "implementation",
-            type = StarlarkFunction.class,
             named = true,
             doc =
                 "the Starlark function implementing this rule, must have exactly one parameter: "
@@ -115,7 +113,6 @@
                     + "outputs."),
         @Param(
             name = "test",
-            type = Boolean.class,
             named = true,
             defaultValue = "False",
             doc =
@@ -128,9 +125,11 @@
                     + "for more information."),
         @Param(
             name = "attrs",
-            type = Dict.class,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             defaultValue = "None",
             doc =
                 "dictionary to declare all the attributes of the rule. It maps from an attribute "
@@ -151,7 +150,6 @@
               @ParamType(type = StarlarkFunction.class) // a function defined in Starlark
             },
             named = true,
-            noneable = true,
             defaultValue = "None",
             valueWhenDisabled = "None",
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_NO_RULE_OUTPUTS_PARAM,
@@ -201,7 +199,6 @@
                     + " <code>ctx.outputs.bin</code>."),
         @Param(
             name = "executable",
-            type = Boolean.class,
             named = true,
             defaultValue = "False",
             doc =
@@ -211,7 +208,6 @@
                     + "for more information."),
         @Param(
             name = "output_to_genfiles",
-            type = Boolean.class,
             named = true,
             defaultValue = "False",
             doc =
@@ -220,25 +216,22 @@
                     + "(e.g. when generating header files for C++), do not set this flag."),
         @Param(
             name = "fragments",
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "List of names of configuration fragments that the rule requires "
                     + "in target configuration."),
         @Param(
             name = "host_fragments",
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "List of names of configuration fragments that the rule requires "
                     + "in host configuration."),
         @Param(
             name = "_skylark_testable",
-            type = Boolean.class,
             named = true,
             defaultValue = "False",
             doc =
@@ -252,9 +245,8 @@
                     + "Starlark rules. This flag may be removed in the future."),
         @Param(
             name = TOOLCHAINS_PARAM,
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "If set, the set of toolchains this rule requires. Toolchains will be "
@@ -262,7 +254,6 @@
                     + "implementation via <code>ctx.toolchain</code>."),
         @Param(
             name = "incompatible_use_toolchain_transition",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -271,7 +262,6 @@
                     + " set."),
         @Param(
             name = "doc",
-            type = String.class,
             named = true,
             defaultValue = "''",
             doc =
@@ -279,15 +269,13 @@
                     + "tools."),
         @Param(
             name = "provides",
-            type = Sequence.class,
             named = true,
             positional = false,
             defaultValue = "[]",
             doc = PROVIDES_DOC),
         @Param(
             name = EXEC_COMPATIBLE_WITH_PARAM,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
@@ -296,9 +284,6 @@
                     + "this rule type."),
         @Param(
             name = "analysis_test",
-            allowedTypes = {
-              @ParamType(type = Boolean.class),
-            },
             named = true,
             positional = false,
             defaultValue = "False",
@@ -318,8 +303,10 @@
                     + " href='AnalysisTestResultInfo.html'>AnalysisTestResultInfo</a>.</li></ul>"),
         @Param(
             name = "build_setting",
-            type = BuildSettingApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = BuildSettingApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
             positional = false,
@@ -332,8 +319,6 @@
                     + "added to this rule, with a type corresponding to the value passed in here."),
         @Param(
             name = "cfg",
-            type = Object.class,
-            noneable = true,
             defaultValue = "None",
             named = true,
             positional = false,
@@ -342,9 +327,11 @@
                     + "apply to its own configuration before analysis."),
         @Param(
             name = "exec_groups",
-            type = Dict.class,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             defaultValue = "None",
             positional = false,
             enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_EXEC_GROUPS,
@@ -388,7 +375,6 @@
       parameters = {
         @Param(
             name = "implementation",
-            type = StarlarkFunction.class,
             named = true,
             doc =
                 "A Starlark function that implements this aspect, with exactly two parameters: "
@@ -399,9 +385,8 @@
                     + "analysis phase for each application of an aspect to a target."),
         @Param(
             name = "attr_aspects",
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "List of attribute names. The aspect propagates along dependencies specified in "
@@ -411,9 +396,11 @@
                     + "target."),
         @Param(
             name = "attrs",
-            type = Dict.class,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             defaultValue = "None",
             doc =
                 "A dictionary declaring all the attributes of the aspect. It maps from an "
@@ -431,7 +418,6 @@
                     + "name, type, and valid values according to the restriction."),
         @Param(
             name = "required_aspect_providers",
-            type = Sequence.class,
             named = true,
             defaultValue = "[]",
             doc =
@@ -452,35 +438,27 @@
                     + "see <code>other_aspect</code> if and only if <code>other_aspect</code> "
                     + "provides <code>FooInfo</code> *or* <code>BarInfo</code> *or* both "
                     + "<code>BazInfo</code> *and* <code>QuxInfo</code>."),
-        @Param(
-            name = "provides",
-            type = Sequence.class,
-            named = true,
-            defaultValue = "[]",
-            doc = PROVIDES_DOC),
+        @Param(name = "provides", named = true, defaultValue = "[]", doc = PROVIDES_DOC),
         @Param(
             name = "fragments",
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "List of names of configuration fragments that the aspect requires "
                     + "in target configuration."),
         @Param(
             name = "host_fragments",
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "List of names of configuration fragments that the aspect requires "
                     + "in host configuration."),
         @Param(
             name = TOOLCHAINS_PARAM,
-            type = Sequence.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
-            generic1 = String.class,
             defaultValue = "[]",
             doc =
                 "If set, the set of toolchains this rule requires. Toolchains will be "
@@ -488,7 +466,6 @@
                     + "implementation via <code>ctx.toolchain</code>."),
         @Param(
             name = "incompatible_use_toolchain_transition",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -497,7 +474,6 @@
                     + " set."),
         @Param(
             name = "doc",
-            type = String.class,
             named = true,
             defaultValue = "''",
             doc =
@@ -505,7 +481,6 @@
                     + "tools."),
         @Param(
             name = "apply_to_generating_rules",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
@@ -544,10 +519,9 @@
               + "attributes. The argument must refer to an absolute label. "
               + "Example: <br><pre class=language-python>Label(\"//tools:default\")</pre>",
       parameters = {
-        @Param(name = "label_string", type = String.class, doc = "the label string."),
+        @Param(name = "label_string", doc = "the label string."),
         @Param(
             name = "relative_to_caller_repository",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -574,16 +548,14 @@
       parameters = {
         @Param(
             name = TOOLCHAINS_PARAM,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
             doc = "<i>Experimental</i> The set of toolchains this execution group requires."),
         @Param(
             name = EXEC_COMPATIBLE_WITH_PARAM,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
index 43c7ac7..eef5fe3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/TemplateVariableInfoApi.java
@@ -59,7 +59,7 @@
         doc = "The <code>TemplateVariableInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(name = "vars", positional = true, named = true, type = Dict.class),
+          @Param(name = "vars", positional = true, named = true),
         },
         selfCall = true,
         useStarlarkThread = true)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
index 60ce569..982bd55 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/WorkspaceGlobalsApi.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.docgen.annot.DocumentMethods;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
@@ -58,7 +59,6 @@
       parameters = {
         @Param(
             name = "name",
-            type = String.class,
             doc =
                 "the name of the workspace. Names must start with a letter and can only contain "
                     + "letters, numbers, and underscores.",
@@ -66,8 +66,6 @@
             positional = false),
         @Param(
             name = "managed_directories",
-            type = Dict.class,
-            generic1 = String.class,
             named = true,
             positional = false,
             defaultValue = "{}",
@@ -104,8 +102,7 @@
       parameters = {
         @Param(
             name = "paths",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             doc = "",
             named = true,
             positional = false)
@@ -125,8 +122,7 @@
       extraPositionals =
           @Param(
               name = "platform_labels",
-              type = Sequence.class,
-              generic1 = String.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
               doc = "The labels of the platforms to register."),
       useStarlarkThread = true)
   NoneType registerExecutionPlatforms(Sequence<?> platformLabels, StarlarkThread thread)
@@ -144,8 +140,7 @@
       extraPositionals =
           @Param(
               name = "toolchain_labels",
-              type = Sequence.class,
-              generic1 = String.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
               doc = "The labels of the toolchains to register."),
       useStarlarkThread = true)
   NoneType registerToolchains(Sequence<?> toolchainLabels, StarlarkThread thread)
@@ -162,16 +157,17 @@
       parameters = {
         @Param(
             name = "name",
-            type = String.class,
             named = true,
             positional = false,
             doc = "The label under '//external' to serve as the alias name"),
         @Param(
             name = "actual",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             positional = false,
-            noneable = true,
             defaultValue = "None",
             doc = "The real label to be aliased")
       },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
index aebdb58..6f0a5a4 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidApplicationResourceInfoApi.java
@@ -18,9 +18,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 
 /** Supplies a resource apk file (".ap_") and related info. */
 @StarlarkBuiltin(
@@ -121,46 +123,60 @@
         parameters = {
           @Param(
               name = "resource_apk",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = ""),
           @Param(
               name = "resource_java_src_jar",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = ""),
           @Param(
               name = "resource_java_class_jar",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = ""),
-          @Param(name = "manifest", type = FileApi.class, named = true, doc = ""),
+          @Param(name = "manifest", named = true, doc = ""),
           @Param(
               name = "resource_proguard_config",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = ""),
           @Param(
               name = "main_dex_proguard_config",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = ""),
           @Param(
               name = "r_txt",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = "",
               defaultValue = "None"),
           @Param(
               name = "resources_zip",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               doc = "",
               defaultValue = "None"),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
index cad04f9..462f5cd 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidAssetsInfoApi.java
@@ -23,9 +23,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 
 /** Provides information about transitive Android assets. */
 @StarlarkBuiltin(
@@ -116,50 +118,50 @@
               name = "label",
               doc = "The label of the target.",
               positional = true,
-              named = false,
-              type = Label.class),
+              named = false),
           @Param(
               name = "validation_result",
               doc = "An artifact of the validation result.",
               positional = true,
               named = true,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "direct_parsed_assets",
               doc = "A depset of all the parsed assets in the target.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = ParsedAndroidAssetsApi.class),
+              allowedTypes = {
+                @ParamType(type = Depset.class, generic1 = ParsedAndroidAssetsApi.class)
+              }),
           @Param(
               name = "transitive_parsed_assets",
               doc = "A depset of all the parsed assets in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = ParsedAndroidAssetsApi.class),
+              allowedTypes = {
+                @ParamType(type = Depset.class, generic1 = ParsedAndroidAssetsApi.class)
+              }),
           @Param(
               name = "transitive_assets",
               doc = "A depset of all the assets in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_symbols",
               doc = "A depset of all the symbols in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_compiled_symbols",
               doc = "A depset of all the compiled symbols in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
index 8073c53..5aa6758 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidBinaryDataInfoApi.java
@@ -73,36 +73,15 @@
         doc = "The <code>AndroidBinaryDataInfoApi</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "resource_apk",
-              doc = "resource_apk",
-              positional = false,
-              named = true,
-              type = FileApi.class),
+          @Param(name = "resource_apk", doc = "resource_apk", positional = false, named = true),
           @Param(
               name = "resource_proguard_config",
               doc = "resource_proguard_config",
               positional = false,
-              named = true,
-              type = FileApi.class),
-          @Param(
-              name = "resources_info",
-              doc = "resources_info",
-              positional = false,
-              named = true,
-              type = AndroidResourcesInfoApi.class),
-          @Param(
-              name = "assets_info",
-              doc = "assets_info",
-              positional = false,
-              named = true,
-              type = AndroidAssetsInfoApi.class),
-          @Param(
-              name = "manifest_info",
-              doc = "manifest_info",
-              positional = false,
-              named = true,
-              type = AndroidManifestInfoApi.class),
+              named = true),
+          @Param(name = "resources_info", doc = "resources_info", positional = false, named = true),
+          @Param(name = "assets_info", doc = "assets_info", positional = false, named = true),
+          @Param(name = "manifest_info", doc = "manifest_info", positional = false, named = true),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
index d6a6743..5038513 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
@@ -58,12 +58,7 @@
         doc = "The <code>AndroidCcLinkParamsInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "store",
-              doc = "The CcInfo provider.",
-              positional = true,
-              named = false,
-              type = CcInfoApi.class),
+          @Param(name = "store", doc = "The CcInfo provider.", positional = true, named = false),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
index 4e0e963..c11233d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDataProcessingApi.java
@@ -20,10 +20,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
@@ -56,15 +58,15 @@
         @Param(
             name = "deps",
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidAssetsInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidAssetsInfoApi.class)
+            },
             positional = false,
             named = true,
             doc = "Dependencies to inherit assets from."),
         @Param(
             name = "neverlink",
             defaultValue = "False",
-            type = Boolean.class,
             positional = false,
             named = true,
             doc =
@@ -90,28 +92,28 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "deps",
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidResourcesInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidResourcesInfoApi.class)
+            },
             positional = false,
             named = true,
             doc = "Dependencies to inherit resources from."),
         @Param(
             name = "assets",
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidAssetsInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidAssetsInfoApi.class),
+            },
             positional = false,
             named = true,
             doc = "Dependencies to inherit assets from."),
         @Param(
             name = "neverlink",
             defaultValue = "False",
-            type = Boolean.class,
             positional = false,
             named = true,
             doc =
@@ -120,8 +122,6 @@
         @Param(
             name = "custom_package",
             positional = false,
-            type = String.class,
-            noneable = false,
             named = true,
             doc = "The Android application package to stamp the manifest with."),
       },
@@ -147,22 +147,25 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "manifest",
             positional = false,
             defaultValue = "None",
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc = "The manifest to stamp. If not passed, a dummy manifest will be generated."),
         @Param(
             name = "custom_package",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "The Android application package to stamp the manifest with. If not provided, the"
@@ -173,7 +176,6 @@
             name = "exports_manifest",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If passed as True, this manifest will be exported to and"
@@ -193,15 +195,15 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "assets",
             positional = false,
             defaultValue = "None",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Targets containing raw assets for this target. If passed, 'assets_dir' must also"
@@ -210,8 +212,10 @@
             name = "assets_dir",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Directory the assets are contained in. Must be passed if and only if 'assets' is"
@@ -220,8 +224,9 @@
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidAssetsInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidAssetsInfoApi.class)
+            },
             named = true,
             doc =
                 "Providers containing assets from dependencies. These assets will be merged"
@@ -230,7 +235,6 @@
             name = "neverlink",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If passed as True, these assets will not be inherited by"
@@ -257,13 +261,11 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "manifest",
             positional = true,
             named = false,
-            type = AndroidManifestInfoApi.class,
             doc =
                 "The provider of this target's manifest. This provider is produced by, "
                     + "for example, stamp_android_manifest."),
@@ -271,16 +273,16 @@
             name = "resources",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = FileProviderApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileProviderApi.class)},
             named = true,
             doc = "Providers of this target's resources."),
         @Param(
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidResourcesInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidResourcesInfoApi.class),
+            },
             named = true,
             doc =
                 "Targets containing raw resources from dependencies. These resources will be merged"
@@ -289,7 +291,6 @@
             name = "neverlink",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If passed as True, these resources will not be inherited by"
@@ -298,7 +299,6 @@
             name = "enable_data_binding",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If True, processes data binding expressions in layout"
@@ -331,13 +331,11 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "manifest",
             positional = true,
             named = false,
-            type = AndroidManifestInfoApi.class,
             doc =
                 "The provider of this target's manifest. This provider is produced by, "
                     + "for example, stamp_android_manifest."),
@@ -345,16 +343,16 @@
             name = "resources",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = FileProviderApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileProviderApi.class)},
             named = true,
             doc = "Providers of this target's resources."),
         @Param(
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = AndroidResourcesInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidResourcesInfoApi.class)
+            },
             named = true,
             doc =
                 "Targets containing raw resources from dependencies. These resources will be merged"
@@ -363,7 +361,6 @@
             name = "neverlink",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If passed as True, these resources will not be inherited by"
@@ -372,7 +369,6 @@
             name = "enable_data_binding",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If True, processes data binding expressions in layout"
@@ -404,13 +400,11 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "resource_info",
             positional = true,
             named = false,
-            type = AndroidResourcesInfoApi.class,
             doc =
                 "The provider containing processed resources for this target, produced, "
                     + "for example, by merge_resources."),
@@ -418,7 +412,6 @@
             name = "asset_info",
             positional = true,
             named = false,
-            type = AndroidAssetsInfoApi.class,
             doc =
                 "The provider containing processed assets for this target, produced, "
                     + "for example, by merge_assets."),
@@ -426,12 +419,10 @@
             name = "library_class_jar",
             positional = true,
             named = false,
-            type = FileApi.class,
             doc = "The library class jar."),
         @Param(
             name = "local_proguard_specs",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             positional = false,
             named = true,
@@ -440,15 +431,15 @@
                     + " inherited in the top-level target."),
         @Param(
             name = "deps",
-            type = Sequence.class,
-            generic1 = AndroidLibraryAarInfoApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = AndroidLibraryAarInfoApi.class)
+            },
             defaultValue = "[]",
             positional = false,
             named = true,
             doc = "Dependant AAR providers used to build this AAR."),
         @Param(
             name = "neverlink",
-            type = Boolean.class,
             defaultValue = "False",
             positional = false,
             named = true,
@@ -478,30 +469,15 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
-        @Param(
-            name = "resource",
-            positional = true,
-            named = false,
-            type = FileApi.class,
-            doc = "The resouce file."),
-        @Param(
-            name = "assets",
-            positional = true,
-            named = false,
-            type = FileApi.class,
-            doc = "The assets file."),
-        @Param(
-            name = "manifest",
-            positional = true,
-            named = false,
-            type = FileApi.class,
-            doc = "The manifest file."),
+        @Param(name = "resource", positional = true, named = false, doc = "The resource file."),
+        @Param(name = "assets", positional = true, named = false, doc = "The assets file."),
+        @Param(name = "manifest", positional = true, named = false, doc = "The manifest file."),
         @Param(
             name = "deps",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             named = true,
             positional = false,
             defaultValue = "[]",
@@ -524,15 +500,16 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "manifest",
             positional = false,
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
-            noneable = true,
             doc =
                 "If passed, the manifest to use for this target. Otherwise, a dummy manifest will"
                     + " be generated."),
@@ -540,17 +517,17 @@
             name = "resources",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = FileProviderApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileProviderApi.class)},
             named = true,
             doc = "Providers of this target's resources."),
         @Param(
             name = "assets",
             positional = false,
             defaultValue = "None",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Targets containing raw assets for this target. If passed, 'assets_dir' must also"
@@ -559,8 +536,10 @@
             name = "assets_dir",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Directory the assets are contained in. Must be passed if and only if 'assets' is"
@@ -569,8 +548,10 @@
             name = "custom_package",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "The Android application package to stamp the manifest with. If not provided, the"
@@ -581,7 +562,6 @@
             name = "aapt_version",
             positional = false,
             defaultValue = "'auto'",
-            type = String.class,
             named = true,
             doc =
                 "The version of aapt to use. Defaults to 'auto'. 'aapt' and 'aapt2' are also"
@@ -590,8 +570,7 @@
             name = "manifest_values",
             positional = false,
             defaultValue = "{}",
-            type = Dict.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Dict.class, generic1 = String.class)},
             named = true,
             doc =
                 "A dictionary of values to be overridden in the manifest. You must expand any"
@@ -600,8 +579,9 @@
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             named = true,
             doc =
                 "Dependency targets. Providers will be extracted from these dependencies for each"
@@ -610,16 +590,14 @@
             name = "nocompress_extensions",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc = "A list of file extensions to leave uncompressed in the resource apk."),
         @Param(
             name = "resource_configuration_filters",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc =
                 "A list of resource configuration filters, such as 'en' that will limit the"
@@ -628,8 +606,7 @@
             name = "densities",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc =
                 "Densities to filter for when building the apk. A corresponding compatible-screens"
@@ -662,14 +639,15 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "shrink_resources",
             positional = false,
-            noneable = true,
             defaultValue = "None",
-            type = Boolean.class,
+            allowedTypes = {
+              @ParamType(type = Boolean.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Whether to shrink resources. Defaults to the value used in Android"
@@ -678,8 +656,7 @@
             name = "resource_configuration_filters",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc =
                 "A list of resource configuration filters, such as 'en' that will limit the"
@@ -688,8 +665,7 @@
             name = "densities",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc =
                 "Densities to filter for when building the apk. A corresponding compatible-screens"
@@ -699,8 +675,7 @@
             name = "nocompress_extensions",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             doc =
                 "A list of file extension to leave uncompressed in apk. Templates must be"
@@ -725,23 +700,22 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "resources",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = FileProviderApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileProviderApi.class)},
             named = true,
             doc = "Providers of this target's resources."),
         @Param(
             name = "assets",
             positional = false,
             defaultValue = "None",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Targets containing raw assets for this target. If passed, 'assets_dir' must also"
@@ -750,8 +724,10 @@
             name = "assets_dir",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "Directory the assets are contained in. Must be passed if and only if 'assets' is"
@@ -759,10 +735,12 @@
         @Param(
             name = "manifest",
             positional = false,
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             named = true,
-            noneable = true,
             doc =
                 "If passed, the manifest to use for this target. Otherwise, a dummy manifest will"
                     + " be generated."),
@@ -770,8 +748,10 @@
             name = "custom_package",
             positional = false,
             defaultValue = "None",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
             doc =
                 "The Android application package to stamp the manifest with. If not provided, the"
@@ -782,8 +762,7 @@
             name = "manifest_values",
             positional = false,
             defaultValue = "{}",
-            type = Dict.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Dict.class, generic1 = String.class)},
             named = true,
             doc =
                 "A dictionary of values to be overridden in the manifest. You must expand any"
@@ -792,15 +771,15 @@
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             named = true,
             doc =
                 "Dependency targets. Providers will be extracted from these dependencies for each"
                     + " type of data."),
         @Param(
             name = "manifest_merger",
-            type = String.class,
             defaultValue = "'auto'",
             positional = false,
             named = true,
@@ -809,8 +788,10 @@
                     + " also supported."),
         @Param(
             name = "binary_settings",
-            type = AndroidBinaryDataSettingsApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = AndroidBinaryDataSettingsApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             positional = false,
             named = true,
@@ -821,14 +802,12 @@
             name = "crunch_png",
             positional = false,
             defaultValue = "True",
-            type = Boolean.class,
             named = true,
             doc = "Whether PNG crunching should be done. Defaults to True."),
         @Param(
             name = "enable_data_binding",
             positional = false,
             defaultValue = "False",
-            type = Boolean.class,
             named = true,
             doc =
                 "Defaults to False. If True, processes data binding expressions in layout"
@@ -860,30 +839,24 @@
             name = "ctx",
             positional = true,
             named = false,
-            type = AndroidDataContextApi.class,
             doc = "The Android data context object for this target."),
         @Param(
             name = "binary_data_info",
             positional = true,
             named = false,
-            type = AndroidBinaryDataInfoApi.class,
             doc = "The Info about the binary to shrink, as produced by process_binary_data."),
         @Param(
             name = "proguard_output_jar",
             positional = true,
             named = false,
-            type = FileApi.class,
             doc = "The proguard jar output file."),
         @Param(
             name = "proguard_mapping",
             positional = true,
             named = false,
-            type = FileApi.class,
             doc = "The proguard mapping output file."),
         @Param(
             name = "binary_settings",
-            type = AndroidBinaryDataSettingsApi.class,
-            noneable = true,
             defaultValue = "None",
             positional = false,
             named = true,
@@ -894,16 +867,18 @@
             name = "deps",
             positional = false,
             defaultValue = "[]",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             named = true,
             doc =
                 "Dependency targets. Providers will be extracted from these dependencies for each"
                     + " type of data."),
         @Param(
             name = "proguard_specs",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             defaultValue = "[]",
             positional = false,
             named = true,
@@ -912,8 +887,9 @@
                     + " inherited in the top-level target."),
         @Param(
             name = "extra_proguard_specs,",
-            type = Sequence.class,
-            generic1 = TransitiveInfoCollectionApi.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = TransitiveInfoCollectionApi.class)
+            },
             defaultValue = "[]",
             positional = false,
             named = true,
@@ -946,8 +922,7 @@
             name = "validated_res",
             doc = "The validated Android resources.",
             positional = true,
-            named = false,
-            type = ValidatedAndroidDataApi.class)
+            named = false)
       })
   FileT resourcesFromValidatedRes(ValidatedAndroidDataT resources);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
index f15f423..0062791 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDeviceBrokerInfoApi.java
@@ -49,7 +49,6 @@
         parameters = {
           @Param(
               name = "type",
-              type = String.class,
               named = true,
               doc =
                   "The type of device broker that is appropriate to use to interact with "
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
index 05d370f..0a87925 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidDex2OatInfoApi.java
@@ -49,12 +49,11 @@
         doc = "The <code>AndroidDex2OatInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(name = "enabled", positional = false, named = true, type = Boolean.class),
+          @Param(name = "enabled", positional = false, named = true),
           @Param(
               name = "execute_dex2oat_on_host",
               positional = false,
               named = true,
-              type = Boolean.class,
               defaultValue = "False"),
           @Param(
               name = "sandbox_for_pregenerating_oat_files_for_tests",
@@ -64,13 +63,11 @@
                 @ParamType(type = NoneType.class),
                 @ParamType(type = FilesToRunProviderApi.class),
               },
-              noneable = true,
               defaultValue = "None"),
           @Param(
               name = "framework",
               positional = false,
               named = true,
-              noneable = true,
               allowedTypes = {
                 @ParamType(type = NoneType.class),
                 @ParamType(type = FileApi.class),
@@ -80,7 +77,6 @@
               name = "dalvik_cache",
               positional = false,
               named = true,
-              noneable = true,
               allowedTypes = {
                 @ParamType(type = NoneType.class),
                 @ParamType(type = FileApi.class),
@@ -90,7 +86,6 @@
               name = "device_props",
               positional = false,
               named = true,
-              noneable = true,
               allowedTypes = {
                 @ParamType(type = NoneType.class),
                 @ParamType(type = FileApi.class),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
index f061fff..f9bd33b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidFeatureFlagSetProviderApi.java
@@ -60,12 +60,7 @@
         doc = "The <code>AndroidFeatureFlagSetProvider</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "flags",
-              doc = "Map of flags",
-              positional = true,
-              named = false,
-              type = Dict.class),
+          @Param(name = "flags", doc = "Map of flags", positional = true, named = false),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
index 0acaef0..0d3a3a9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdeInfoProviderApi.java
@@ -23,10 +23,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.java.OutputJarApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 
 /**
@@ -191,98 +193,114 @@
               doc = "A string of the Java package.",
               positional = true,
               named = false,
-              noneable = true,
-              type = String.class),
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "manifest",
               doc = "An artifact of the Android manifest.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "generated_manifest",
               doc = "An artifact of the generated Android manifest.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "idl_import_root",
               doc = "A string of the idl import root.",
               positional = true,
               named = false,
-              noneable = true,
-              type = String.class),
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "idl_srcs",
               doc = "A list of artifacts of the idl srcs.",
               positional = true,
               named = false,
-              type = Sequence.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
           @Param(
               name = "idl_generated_java_files",
               doc = "A list of artifacts of the idl generated java files.",
               positional = true,
               named = false,
-              type = Sequence.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
           @Param(
               name = "idl_source_jar",
               doc = "An artifact of the source Jar with the idl generated java files.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "idl_class_jar",
               doc = "An artifact of the class Jar with the compiled idl generated java files.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "defines_android_resources",
               doc = "A boolean if target specifies Android resources.",
               positional = true,
-              named = false,
-              type = Boolean.class),
+              named = false),
           @Param(
               name = "resource_jar",
               doc = "An artifact of the Jar containing Android resources.",
               positional = true,
               named = false,
-              noneable = true,
-              type = OutputJarApi.class),
+              allowedTypes = {
+                @ParamType(type = OutputJarApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "resource_apk",
               doc = "An artifact of the Apk containing Android resources.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "signed_apk",
               doc = "An artifact of the signed Apk.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "aar",
               doc = "An artifact of the Android archive.",
               positional = true,
               named = false,
-              noneable = true,
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "apks_under_test",
               doc = "A list of artifacts of the apks under test",
               positional = true,
               named = false,
-              type = Sequence.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
           @Param(
               name = "native_libs",
               doc =
@@ -290,8 +308,7 @@
                       + "libs.",
               positional = true,
               named = false,
-              type = Dict.class,
-              generic1 = String.class)
+              allowedTypes = {@ParamType(type = Dict.class, generic1 = String.class)})
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
index 9e82f4f..0f21429 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidIdlProviderApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -92,15 +93,13 @@
               doc = "A depset of strings of all the idl import roots in the transitive closure.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = String.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = String.class)}),
           @Param(
               name = "transitive_idl_imports",
               doc = "A depset of artifacts of all the idl imports in the transitive closure.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_idl_jars",
               doc =
@@ -108,8 +107,7 @@
                       + "transitive closure.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_idl_preprocessed",
               doc =
@@ -117,8 +115,7 @@
                       + "closure.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
index 1a3ada2..b2a7112 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidInstrumentationInfoApi.java
@@ -62,7 +62,6 @@
         parameters = {
           @Param(
               name = "target",
-              type = ApkInfoApi.class,
               named = true,
               doc = "The target ApkInfo of the instrumentation test.")
         },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
index ef103a3..cd77bee 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryAarInfoApi.java
@@ -68,30 +68,18 @@
         doc = "The <code>AndroidLibraryAarInfoApi</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "aar",
-              doc = "resource_apk",
-              positional = false,
-              named = true,
-              type = FileApi.class),
-          @Param(
-              name = "manifest",
-              doc = "manifest",
-              positional = false,
-              named = true,
-              type = FileApi.class),
+          @Param(name = "aar", doc = "resource_apk", positional = false, named = true),
+          @Param(name = "manifest", doc = "manifest", positional = false, named = true),
           @Param(
               name = "aars_from_deps",
               doc = "List of AndroidLibraryAarInfo",
               positional = false,
-              named = true,
-              type = Sequence.class),
+              named = true),
           @Param(
               name = "defines_local_resources",
               doc = "defines_local_resources",
               positional = false,
-              named = true,
-              type = Boolean.class),
+              named = true),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
index 6ad4dce..346f513 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -60,8 +61,7 @@
               doc = "Resource class jars.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
index b591b94..91c97db 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidManifestInfoApi.java
@@ -66,14 +66,13 @@
         doc = "The <code>AndroidManifestInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(name = "manifest", positional = true, named = true, type = FileApi.class),
-          @Param(name = "package", positional = true, named = true, type = String.class),
+          @Param(name = "manifest", positional = true, named = true),
+          @Param(name = "package", positional = true, named = true),
           @Param(
               name = "exports_manifest",
               positional = true,
               named = true,
-              defaultValue = "False",
-              type = Boolean.class),
+              defaultValue = "False"),
         },
         selfCall = true)
     AndroidManifestInfoApi<FileT> androidManifestInfo(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
index 3926abf..bcfd314 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidNativeLibsInfoApi.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -61,8 +62,7 @@
         parameters = {
           @Param(
               name = "native_libs",
-              type = Depset.class,
-              generic1 = FileApi.class,
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)},
               named = true,
               doc = "The native libraries produced by the rule."),
         },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
index b23c63d..0bc44d0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidPreDexJarProviderApi.java
@@ -59,8 +59,7 @@
               name = "pre_dex_jar",
               doc = "The jar to be dexed.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
index c8f1b4d..42d750b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidProguardInfoApi.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -61,8 +62,7 @@
               doc = "A list of local proguard specs.",
               positional = true,
               named = false,
-              type = Sequence.class,
-              generic1 = FileApi.class)
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)})
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
index 3322c8a..6846e15 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidResourcesInfoApi.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -128,18 +129,9 @@
         doc = "The <code>AndroidResourcesInfo</code> constructor.",
         documented = false,
         parameters = {
-          @Param(
-              name = "label",
-              doc = "A label of the target.",
-              positional = true,
-              named = false,
-              type = Label.class),
-          @Param(
-              name = "manifest",
-              positional = true,
-              named = true,
-              type = AndroidManifestInfoApi.class),
-          @Param(name = "r_txt", positional = true, named = true, type = FileApi.class),
+          @Param(name = "label", doc = "A label of the target.", positional = true, named = false),
+          @Param(name = "manifest", positional = true, named = true),
+          @Param(name = "r_txt", positional = true, named = true),
           @Param(
               name = "transitive_android_resources",
               doc =
@@ -147,43 +139,41 @@
                       + "closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = ValidatedAndroidDataApi.class),
+              allowedTypes = {
+                @ParamType(type = Depset.class, generic1 = ValidatedAndroidDataApi.class)
+              }),
           @Param(
               name = "direct_android_resources",
               doc = "A depset of ValidatedAndroidData of Android Resources for the target.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = ValidatedAndroidDataApi.class),
+              allowedTypes = {
+                @ParamType(type = Depset.class, generic1 = ValidatedAndroidDataApi.class)
+              }),
           @Param(
               name = "transitive_resources",
               doc = "A depset of Artifacts of Android Resource files in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_manifests",
               doc = "A depset of Artifacts of Android Manifests in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_aapt2_r_txt",
               doc = "A depset of Artifacts of Android AAPT2 R.txt files in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_symbols_bin",
               doc = "A depset of Artifacts of Android symbols files in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               name = "transitive_compiled_symbols",
               doc =
@@ -191,25 +181,22 @@
                       + "closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
           @Param(
               // TODO(b/119560471): remove.
               name = "transitive_static_lib",
               doc = "A depset of Artifacts of static lib files in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              defaultValue = "unbound",
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)},
+              defaultValue = "unbound"),
           @Param(
               name = "transitive_r_txt",
               doc = "A depset of Artifacts of Android AAPT R.txt files in the transitive closure.",
               positional = true,
               named = true,
-              type = Depset.class,
-              defaultValue = "unbound", // needed to allow removing any earlier parameters.
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)},
+              defaultValue = "unbound"), // needed to allow removing any earlier parameters.
           // TODO(b/132383435): remove this
           @Param(
               name = "validation_artifacts",
@@ -217,8 +204,7 @@
               doc = "A depset of opaque files to trigger resource validation.",
               positional = false,
               named = true,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
index ce9859b..bd96b40 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidSdkProviderApi.java
@@ -21,10 +21,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.TransitiveInfoCollectionApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
-import net.starlark.java.eval.StarlarkValue;
+import net.starlark.java.eval.NoneType;
 
 /**
  * Configured targets implementing this provider can contribute Android Sdk information to the
@@ -142,124 +143,114 @@
               name = "build_tools_version",
               doc = "A string of the build tools version.",
               positional = true,
-              named = false,
-              type = String.class),
+              named = false),
           @Param(
               name = "framework_aidl",
               doc = "An artifact of the AIDL framework.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "aidl_lib",
               doc = "A transitive info collection of the AIDL lib.",
               positional = true,
               named = false,
-              type = TransitiveInfoCollectionApi.class,
-              noneable = true),
+              allowedTypes = {
+                @ParamType(type = TransitiveInfoCollectionApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "android_jar",
               doc = "An artifact of the Android Jar.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "sourceProperties",
               doc = "An artifact of the AIDL lib.",
               positional = true,
               named = false,
-              type = FileApi.class,
-              noneable = true),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "shrinked_android_jar",
               doc = "An artifact of the shrunk Android Jar.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "main_dex_classes",
               doc = "An artifact of the main dex classes.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "adb",
               doc = "A files to run provider of ADB.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "dx",
               doc = "A files to run provider of Dx.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "main_dex_list_creator",
               doc = "A files to run provider of the main dex list creator.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "aidl",
               doc = "A files to run provider of AIDL.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "aapt",
               doc = "A files to run provider of AAPT.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "aapt2",
               doc = "A files to run provider of AAPT2.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "apk_builder",
               doc = "A files to run provider of the Apk builder.",
               positional = true,
               named = false,
-              type = FilesToRunProviderApi.class,
-              noneable = true),
+              allowedTypes = {
+                @ParamType(type = FilesToRunProviderApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "apk_signer",
               doc = "A files to run provider of the Apk signer.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "proguard",
               doc = "A files to run provider of Proguard.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "zipalign",
               doc = "A files to run provider of Zipalign.",
               positional = true,
-              named = false,
-              type = FilesToRunProviderApi.class),
+              named = false),
           @Param(
               name = "system",
               doc = "",
-              noneable = true,
               defaultValue = "None",
               positional = true,
-              named = false,
-              type = StarlarkValue.class),
+              named = false),
         },
         selfCall = true)
     @StarlarkConstructor
     AndroidSdkProviderApi<FileT, FilesToRunProviderT, TransT> createInfo(
         String buildToolsVersion,
         FileT frameworkAidl,
-        /*noneable*/ Object aidlLib,
+        Object aidlLib,
         FileT androidJar,
-        /*noneable*/ Object sourceProperties,
+        Object sourceProperties,
         FileT shrinkedAndroidJar,
         FileT mainDexClasses,
         FilesToRunProviderT adb,
@@ -268,11 +259,11 @@
         FilesToRunProviderT aidl,
         FilesToRunProviderT aapt,
         FilesToRunProviderT aapt2,
-        /*noneable*/ Object apkBuilder,
+        Object apkBuilder,
         FilesToRunProviderT apkSigner,
         FilesToRunProviderT proguard,
         FilesToRunProviderT zipalign,
-        /*noneable*/ Object system)
+        Object system)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
index e6fa3de..ac44ba3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/AndroidStarlarkCommonApi.java
@@ -35,7 +35,7 @@
   @StarlarkMethod(
       name = "create_device_broker_info",
       documented = false,
-      parameters = {@Param(name = "type", type = String.class)})
+      parameters = {@Param(name = "type")})
   AndroidDeviceBrokerInfoApi createDeviceBrokerInfo(String deviceBrokerType);
 
   @StarlarkMethod(
@@ -52,8 +52,7 @@
             name = "resource",
             doc = "The android resource file.",
             positional = true,
-            named = false,
-            type = FileApi.class)
+            named = false)
       })
   String getSourceDirectoryRelativePathFromResource(FileT resource);
 
@@ -78,8 +77,7 @@
                 "A JavaInfo that will be used as an implicit export for sourceless deps exports"
                     + " compatibility.",
             positional = true,
-            named = false,
-            type = JavaInfoApi.class)
+            named = false)
       })
   JavaInfoT enableImplicitSourcelessDepsExportsCompatibility(JavaInfoT javaInfo);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
index bb63fa3..0d26d7f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -21,9 +21,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -135,57 +137,69 @@
               doc = "The setter_stores.bin files .",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "class_info_file",
               doc = "The class_info files for this rule.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "br_file",
               doc = "The br file for this rule.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
-              type = FileApi.class),
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "label",
               doc = "The label of the current rule.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
-              type = String.class),
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "java_package",
               doc = "The java package of the current rule.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
-              type = String.class),
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = NoneType.class),
+              }),
           @Param(
               name = "databinding_v2_providers_in_deps",
               doc = "The DatabindingV2Provider instances from dependencies.",
               positional = false,
               named = true,
               defaultValue = "[]",
-              type = Sequence.class,
-              generic1 = DataBindingV2ProviderApi.class),
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = DataBindingV2ProviderApi.class)
+              }),
           @Param(
               name = "databinding_v2_providers_in_exports",
               doc = "The DatabindingV2Provider instances from exports.",
               positional = false,
               named = true,
               defaultValue = "[]",
-              type = Sequence.class,
-              generic1 = DataBindingV2ProviderApi.class),
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = DataBindingV2ProviderApi.class)
+              }),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
index cd5cd99..e5135a1 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/ProguardMappingProviderApi.java
@@ -58,8 +58,7 @@
               name = "proguard_mapping",
               doc = "An artifact of the proguard mapping.",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
index c40c4db..b49d2b0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/android/UsesDataBindingProviderApi.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -65,8 +66,7 @@
               doc = "A list of artifacts of the metadata outputs.",
               positional = true,
               named = false,
-              type = Sequence.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
index 2245b13..024fd12 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleCommonApi.java
@@ -25,10 +25,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkThread;
@@ -207,7 +209,6 @@
             name = "xcode_config",
             positional = true,
             named = false,
-            type = XcodeConfigInfoApi.class,
             doc = "A provider containing information about the xcode configuration."),
       })
   ImmutableMap<String, String> getAppleHostSystemEnv(XcodeConfigInfoApiT xcodeConfig);
@@ -224,13 +225,11 @@
             name = "xcode_config",
             positional = true,
             named = false,
-            type = XcodeConfigInfoApi.class,
             doc = "A provider containing information about the xcode configuration."),
         @Param(
             name = "platform",
             positional = true,
             named = false,
-            type = ApplePlatformApi.class,
             doc = "The apple platform."),
       })
   ImmutableMap<String, String> getTargetAppleEnvironment(
@@ -263,7 +262,6 @@
       parameters = {
         @Param(
             name = "uses_swift",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             positional = false,
@@ -272,7 +270,6 @@
       extraKeywords =
           @Param(
               name = "kwargs",
-              type = Dict.class,
               defaultValue = "{}",
               doc = "Dictionary of arguments."),
       useStarlarkThread = true)
@@ -286,15 +283,16 @@
       parameters = {
         @Param(
             name = "binary",
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc = "The dylib binary artifact of the dynamic framework."),
         @Param(
             name = "objc",
-            type = ObjcProviderApi.class,
             named = true,
             positional = false,
             doc =
@@ -302,10 +300,11 @@
                     + "dependencies linked into the binary."),
         @Param(
             name = "framework_dirs",
-            type = Depset.class,
-            generic1 = String.class,
+            allowedTypes = {
+              @ParamType(type = Depset.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc =
@@ -313,10 +312,11 @@
                     + "framework."),
         @Param(
             name = "framework_files",
-            type = Depset.class,
-            generic1 = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = Depset.class, generic1 = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc =
@@ -340,31 +340,23 @@
               + "<p>This API is <b>highly experimental</b> and subject to change at any time. Do "
               + "not depend on the stability of this function at this time.",
       parameters = {
-        @Param(
-            name = "ctx",
-            type = StarlarkRuleContextApi.class,
-            named = true,
-            positional = false,
-            doc = "The Starlark rule context."),
+        @Param(name = "ctx", named = true, positional = false, doc = "The Starlark rule context."),
         @Param(
             name = "extra_linkopts",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
             doc = "Extra linkopts to be passed to the linker action."),
         @Param(
             name = "extra_link_inputs",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
             doc = "Extra files to pass to the linker action."),
         @Param(
             name = "stamp",
-            type = StarlarkInt.class,
             named = true,
             positional = false,
             defaultValue = "-1",
@@ -389,10 +381,7 @@
       name = "dotted_version",
       doc = "Creates a new <a href=\"DottedVersion.html\">DottedVersion</a> instance.",
       parameters = {
-        @Param(
-            name = "version",
-            type = String.class,
-            doc = "The string representation of the DottedVersion.")
+        @Param(name = "version", doc = "The string representation of the DottedVersion.")
       })
   DottedVersionApi<?> dottedVersion(String version) throws EvalException;
 
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
index 64b2300..7c7c072 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleConfigurationApi.java
@@ -65,7 +65,6 @@
             name = "platform_type",
             positional = true,
             named = false,
-            type = ApplePlatformTypeApi.class,
             doc = "The apple platform type.")
       })
   ApplePlatformApi getMultiArchPlatform(ApplePlatformTypeApiT platformType);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
index e039616..463ea256 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleStaticLibraryInfoApi.java
@@ -64,13 +64,11 @@
         parameters = {
           @Param(
               name = "archive",
-              type = FileApi.class,
               named = true,
               positional = false,
               doc = "Multi-architecture archive (.a) representing a static library"),
           @Param(
               name = "objc",
-              type = ObjcProviderApi.class,
               named = true,
               positional = false,
               doc =
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
index c60aba5..318f3e0 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/AppleToolchainApi.java
@@ -44,7 +44,6 @@
             name = "configuration",
             positional = true,
             named = false,
-            type = AppleConfigurationApi.class,
             doc = "The apple configuration fragment.")
       })
   String platformFrameworkDirFromConfig(AppleConfigurationApiT configuration);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
index b8a35db..27449d3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/DottedVersionApi.java
@@ -39,12 +39,7 @@
           "Compares based on most signifigant (first) not-matching version component. "
               + "So, for example, 1.2.3 < 1.2.4",
       parameters = {
-        @Param(
-            name = "other",
-            positional = true,
-            named = false,
-            type = DottedVersionApi.class,
-            doc = "The other dotted version.")
+        @Param(name = "other", positional = true, named = false, doc = "The other dotted version.")
       })
   int compareTo_starlark(SelfT other);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
index 646cd80..93a9222 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/ObjcConfigurationApi.java
@@ -53,7 +53,6 @@
             name = "platform_type",
             positional = true,
             named = false,
-            type = ApplePlatformTypeApi.class,
             doc = "The apple platform type."),
       })
   String getSimulatorDeviceForPlatformType(ApplePlatformTypeApiT platformType);
@@ -67,7 +66,6 @@
             name = "platform_type",
             positional = true,
             named = false,
-            type = ApplePlatformTypeApi.class,
             doc = "The apple platform type."),
       })
   DottedVersionApi<?> getSimulatorVersionForPlatformType(ApplePlatformTypeApiT platformType);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
index 822bfc8..546fe0e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/apple/XcodeConfigInfoApi.java
@@ -55,7 +55,6 @@
             name = "platform_type",
             positional = true,
             named = false,
-            type = ApplePlatformTypeApi.class,
             doc = "The apple platform type."),
       })
   DottedVersionApi<?> getMinimumOsForPlatformType(ApplePlatformTypeApiT platformType);
@@ -66,12 +65,7 @@
           "The version of the platform SDK that will be used to build targets for the given "
               + "platform.",
       parameters = {
-        @Param(
-            name = "platform",
-            positional = true,
-            named = false,
-            type = ApplePlatformApi.class,
-            doc = "The apple platform."),
+        @Param(name = "platform", positional = true, named = false, doc = "The apple platform."),
       })
   DottedVersionApi<?> getSdkVersionForPlatform(ApplePlatformApiT platform);
 
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigFeatureFlagProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigFeatureFlagProviderApi.java
index 1919101..b5ffb81 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigFeatureFlagProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigFeatureFlagProviderApi.java
@@ -37,10 +37,7 @@
       name = "is_valid_value",
       doc = "The value of the flag in the configuration used by the flag rule.",
       parameters = {
-        @Param(
-            name = "value",
-            type = String.class,
-            doc = "String, the value to check for validity for this flag."),
+        @Param(name = "value", doc = "String, the value to check for validity for this flag."),
       })
   boolean isValidValue(String value);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
index ecd1820..d230eb9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/config/ConfigGlobalLibraryApi.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.docgen.annot.DocumentMethods;
 import com.google.devtools.build.docgen.annot.StarlarkConstructor;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
@@ -51,7 +52,6 @@
       parameters = {
         @Param(
             name = "implementation",
-            type = StarlarkCallable.class,
             positional = false,
             named = true,
             // TODO(cparsons): The settings dict should take actual Label objects as keys and not
@@ -76,8 +76,7 @@
                     + "split transition."),
         @Param(
             name = "inputs",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             positional = false,
             named = true,
             doc =
@@ -86,8 +85,7 @@
                     + "parameter."),
         @Param(
             name = "outputs",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             positional = false,
             named = true,
             doc =
@@ -119,7 +117,6 @@
       parameters = {
         @Param(
             name = "settings",
-            type = Dict.class,
             positional = false,
             named = true,
             doc =
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
index bbc43be..29e529e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/core/StructApi.java
@@ -97,11 +97,7 @@
                 + "<pre class=\"language-python\">s = struct(x = 2, y = 3)\n"
                 + "return s.x + getattr(s, \"y\")  # returns 5</pre>",
         extraKeywords =
-            @Param(
-                name = "kwargs",
-                type = Dict.class,
-                defaultValue = "{}",
-                doc = "Dictionary of arguments."),
+            @Param(name = "kwargs", defaultValue = "{}", doc = "Dictionary of arguments."),
         useStarlarkThread = true,
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index cab2f1d..c62e5e3 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -73,7 +73,6 @@
       parameters = {
         @Param(
             name = "actions",
-            type = StarlarkActionFactoryApi.class,
             positional = false,
             named = true,
             doc = "<code>actions</code> object."),
@@ -81,21 +80,18 @@
             name = "feature_configuration",
             doc = "<code>feature_configuration</code> to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "cc_toolchain",
             doc = "<code>CcToolchainInfo</code> provider to be used.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "srcs",
             doc = "The list of source files to be compiled.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "public_hdrs",
             doc =
@@ -103,8 +99,7 @@
                     + "rules transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "private_hdrs",
             doc =
@@ -112,8 +107,7 @@
                     + " dependent rules.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "includes",
             doc =
@@ -121,8 +115,7 @@
                     + "Usually passed with -I. Propagated to dependents transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "quote_includes",
             doc =
@@ -132,8 +125,7 @@
                     + "transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "system_includes",
             doc =
@@ -143,8 +135,7 @@
                     + "transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "framework_includes",
             doc =
@@ -153,8 +144,7 @@
                     + "dependents transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "defines",
             doc =
@@ -162,8 +152,7 @@
                     + " to dependents transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "local_defines",
             doc =
@@ -171,8 +160,7 @@
                     + " propagated to dependents transitively.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "include_prefix",
             doc =
@@ -183,8 +171,7 @@
                     + "prefix is added.",
             positional = false,
             named = true,
-            defaultValue = "''",
-            type = String.class),
+            defaultValue = "''"),
         @Param(
             name = "strip_include_prefix",
             doc =
@@ -196,51 +183,44 @@
                     + " added after this prefix is stripped.",
             positional = false,
             named = true,
-            defaultValue = "''",
-            type = String.class),
+            defaultValue = "''"),
         @Param(
             name = "user_compile_flags",
             doc = "Additional list of compilation options.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "compilation_contexts",
             doc = "Headers from dependencies used for compilation.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "name",
             doc =
                 "This is used for naming the output artifacts of actions created by this "
                     + "method.",
             positional = false,
-            named = true,
-            type = String.class),
+            named = true),
         @Param(
             name = "disallow_pic_outputs",
             doc = "Whether PIC outputs should be created.",
             positional = false,
             named = true,
-            defaultValue = "False",
-            type = Boolean.class),
+            defaultValue = "False"),
         @Param(
             name = "disallow_nopic_outputs",
             doc = "Whether NOPIC outputs should be created.",
             positional = false,
             named = true,
-            defaultValue = "False",
-            type = Boolean.class),
+            defaultValue = "False"),
         @Param(
             name = "additional_inputs",
             doc = "List of additional files needed for compilation of srcs",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
       })
   Tuple<Object> compile(
       StarlarkActionFactoryT starlarkActionFactoryApi,
@@ -273,7 +253,6 @@
       parameters = {
         @Param(
             name = "actions",
-            type = StarlarkActionFactoryApi.class,
             positional = false,
             named = true,
             doc = "<code>actions</code> object."),
@@ -281,21 +260,18 @@
             name = "feature_configuration",
             doc = "<code>feature_configuration</code> to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "cc_toolchain",
             doc = "<code>CcToolchainInfo</code> provider to be used.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "compilation_outputs",
             doc = "Compilation outputs containing object files to link.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {
               @ParamType(type = CcCompilationOutputsApi.class),
               @ParamType(type = NoneType.class)
@@ -305,8 +281,7 @@
             doc = "Additional list of linker options.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "linking_contexts",
             doc =
@@ -314,37 +289,32 @@
                     + "generated by this rule.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "name",
             doc =
                 "This is used for naming the output artifacts of actions created by this "
                     + "method.",
             positional = false,
-            named = true,
-            type = String.class),
+            named = true),
         @Param(
             name = "language",
             doc = "Only C++ supported for now. Do not use this parameter.",
             positional = false,
             named = true,
-            defaultValue = "'c++'",
-            type = String.class),
+            defaultValue = "'c++'"),
         @Param(
             name = "output_type",
             doc = "Can be either 'executable' or 'dynamic_library'.",
             positional = false,
             named = true,
-            defaultValue = "'executable'",
-            type = String.class),
+            defaultValue = "'executable'"),
         @Param(
             name = "link_deps_statically",
             doc = " True to link dependencies statically, False dynamically.",
             positional = false,
             named = true,
-            defaultValue = "True",
-            type = Boolean.class),
+            defaultValue = "True"),
         @Param(
             name = "stamp",
             doc =
@@ -355,22 +325,22 @@
                     + "unset (or set to 0) when generating the executable output for test rules.",
             positional = false,
             named = true,
-            defaultValue = "0",
-            type = StarlarkInt.class),
+            defaultValue = "0"),
         @Param(
             name = "additional_inputs",
             doc = "For additional inputs to the linking action, e.g.: linking scripts.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "grep_includes",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            allowedTypes = {@ParamType(type = FileApi.class), @ParamType(type = NoneType.class)}),
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            }),
       })
   LinkingOutputsT link(
       StarlarkActionFactoryT starlarkActionFactoryApi,
@@ -398,17 +368,21 @@
             doc = "List of object files.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            allowedTypes = {@ParamType(type = Depset.class), @ParamType(type = NoneType.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "pic_objects",
             doc = "List of pic object files.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            allowedTypes = {@ParamType(type = Depset.class), @ParamType(type = NoneType.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
       })
   CompilationOutputsT createCompilationOutputsFromStarlark(
       Object objectsObject, Object picObjectsObject) throws EvalException;
@@ -417,12 +391,7 @@
       name = "merge_compilation_outputs",
       doc = "Merge compilation outputs.",
       parameters = {
-        @Param(
-            name = "compilation_outputs",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+        @Param(name = "compilation_outputs", positional = false, named = true, defaultValue = "[]"),
       })
   CompilationOutputsT mergeCcCompilationOutputsFromStarlark(
       Sequence<?> compilationOutputs) // <CompilationOutputsT> expected
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
index 074b7e0..f08e5fb 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcInfoApi.java
@@ -68,7 +68,6 @@
               doc = "The <code>CompilationContext</code>.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
               allowedTypes = {
                 @ParamType(type = CcCompilationContextApi.class),
@@ -79,7 +78,6 @@
               doc = "The <code>LinkingContext</code>.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
               allowedTypes = {
                 @ParamType(type = CcLinkingContextApi.class),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
index 9cd50a8..4c85d0c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcModuleApi.java
@@ -80,30 +80,29 @@
             name = "ctx",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            type = StarlarkRuleContextApi.class,
+            allowedTypes = {
+              @ParamType(type = StarlarkRuleContextApi.class),
+              @ParamType(type = NoneType.class),
+            },
             doc = "The rule context."),
         @Param(
             name = "cc_toolchain",
             doc = "cc_toolchain for which we configure features.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "requested_features",
             doc = "List of features to be enabled.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "unsupported_features",
             doc = "List of features that are unsupported by the current rule.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
       })
   FeatureConfigurationT configureFeatures(
       Object ruleContextOrNone,
@@ -120,8 +119,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "action_name",
             doc =
@@ -142,8 +140,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "action_name",
             doc =
@@ -165,8 +162,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "feature_name",
             doc = "Name of the feature.",
@@ -183,8 +179,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "action_name",
             doc = "Name of the action_config.",
@@ -205,8 +200,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "action_name",
             doc =
@@ -220,8 +214,7 @@
             name = "variables",
             doc = "Build variables to be used for template expansions.",
             named = true,
-            positional = false,
-            type = CcToolchainVariablesApi.class),
+            positional = false),
       })
   Sequence<String> getCommandLine(
       FeatureConfigurationT featureConfiguration,
@@ -237,8 +230,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "action_name",
             doc =
@@ -252,8 +244,7 @@
             name = "variables",
             doc = "Build variables to be used for template expansion.",
             positional = false,
-            named = true,
-            type = CcToolchainVariablesApi.class),
+            named = true),
       })
   Dict<String, String> getEnvironmentVariable(
       FeatureConfigurationT featureConfiguration,
@@ -269,14 +260,12 @@
             name = "cc_toolchain",
             doc = "cc_toolchain for which we are creating build variables.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "source_file",
             doc =
@@ -286,8 +275,7 @@
                     + "the toolchain author to properly specify and position compiler flags.",
             named = true,
             positional = false,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
         @Param(
             name = "output_file",
             doc =
@@ -297,18 +285,16 @@
                     + "the toolchain author to properly specify and position compiler flags.",
             named = true,
             positional = false,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
         @Param(
             name = "user_compile_flags",
             doc = "List of additional compilation flags (copts).",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
               @ParamType(type = NoneType.class),
-              @ParamType(type = Sequence.class),
             }),
         @Param(
             name = "include_directories",
@@ -316,64 +302,80 @@
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "quote_include_directories",
             doc = "Depset of quote include directories.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "system_include_directories",
             doc = "Depset of system include directories.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "framework_include_directories",
             doc = "Depset of framework include directories.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "preprocessor_defines",
             doc = "Depset of preprocessor defines.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "thinlto_index",
             doc = "LTO index file path.",
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = String.class)}),
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "thinlto_input_bitcode_file",
             doc = "Bitcode file that is input to LTO backend.",
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = String.class)}),
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "thinlto_output_object_file",
             doc = "Object file that is output by LTO backend.",
             named = true,
             positional = false,
             defaultValue = "None",
-            noneable = true,
-            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = String.class)}),
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "use_pic",
             doc = "When true the compilation will generate position independent code.",
@@ -414,21 +416,18 @@
             name = "cc_toolchain",
             doc = "cc_toolchain for which we are creating build variables.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "library_search_directories",
             doc = "Depset of directories where linker will look for libraries at link time.",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
         @Param(
             name = "runtime_library_search_directories",
@@ -436,7 +435,6 @@
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
         @Param(
             name = "user_link_flags",
@@ -444,29 +442,25 @@
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Sequence.class)}),
         @Param(
             name = "output_file",
             doc = "Optional output file path.",
             named = true,
             positional = false,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
         @Param(
             name = "param_file",
             doc = "Optional param file path.",
             named = true,
             positional = false,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
         @Param(
             name = "def_file",
             doc = "Optional .def file path.",
             named = true,
             positional = false,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
         // TODO(b/65151735): Remove once we migrate crosstools to features
         @Param(
             name = "is_using_linker",
@@ -537,7 +531,6 @@
       parameters = {
         @Param(
             name = "actions",
-            type = StarlarkActionFactoryApi.class,
             positional = false,
             named = true,
             doc = "<code>actions</code> object."),
@@ -545,30 +538,32 @@
             name = "feature_configuration",
             doc = "<code>feature_configuration</code> to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "cc_toolchain",
             doc = "<code>CcToolchainInfo</code> provider to be used.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "static_library",
             doc = "<code>File</code> of static library to be linked.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            type = FileApi.class),
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "pic_static_library",
             doc = "<code>File</code> of pic static library to be linked.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            type = FileApi.class),
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "dynamic_library",
             doc =
@@ -576,33 +571,35 @@
                     + "and used for linking if <code>interface_library</code> is not passed.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            type = FileApi.class),
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "interface_library",
             doc = "<code>File</code> of interface library to be linked.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
-            type = FileApi.class),
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            }),
         @Param(
             name = "pic_objects",
             doc = "Experimental, do not use",
             positional = false,
             named = true,
             defaultValue = "unbound",
-            type = Sequence.class,
-            generic1 = FileApi.class),
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
         @Param(
             name = "objects",
             doc = "Experimental, do not use",
             positional = false,
             named = true,
             defaultValue = "unbound",
-            type = Sequence.class,
-            generic1 = FileApi.class),
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)}),
         @Param(
             name = "alwayslink",
             doc = "Whether to link the static library/objects in the --whole_archive block.",
@@ -616,7 +613,9 @@
                     + "Empty string to use the default.",
             positional = false,
             named = true,
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+            },
             defaultValue = "''"),
         @Param(
             name = "interface_library_symlink_path",
@@ -625,7 +624,6 @@
                     + "Empty string to use the default.",
             positional = false,
             named = true,
-            type = String.class,
             defaultValue = "''"),
       })
   LibraryToLinkT createLibraryLinkerInput(
@@ -653,14 +651,12 @@
             name = "owner",
             doc = "The label of the target that produced all files used in this input.",
             positional = false,
-            named = true,
-            type = Label.class),
+            named = true),
         @Param(
             name = "libraries",
             doc = "List of <code>LibraryToLink</code>.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
         @Param(
@@ -668,7 +664,6 @@
             doc = "List of user link flags passed as strings.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
         @Param(
@@ -676,7 +671,6 @@
             doc = "For additional inputs to the linking action, e.g.: linking scripts.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
       })
@@ -702,7 +696,6 @@
       parameters = {
         @Param(
             name = "actions",
-            type = StarlarkActionFactoryApi.class,
             positional = false,
             named = true,
             doc = "<code>actions</code> object."),
@@ -720,7 +713,6 @@
             doc = "Depset of <code>LinkerInput</code>.",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Depset.class)}),
         @Param(
@@ -729,7 +721,6 @@
             positional = false,
             named = true,
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_REQUIRE_LINKER_INPUT_CC_API,
-            noneable = true,
             defaultValue = "None",
             valueWhenDisabled = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Sequence.class)}),
@@ -739,7 +730,6 @@
             positional = false,
             named = true,
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_REQUIRE_LINKER_INPUT_CC_API,
-            noneable = true,
             defaultValue = "None",
             valueWhenDisabled = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Sequence.class)}),
@@ -749,7 +739,6 @@
             positional = false,
             named = true,
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_REQUIRE_LINKER_INPUT_CC_API,
-            noneable = true,
             defaultValue = "None",
             valueWhenDisabled = "None",
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = Sequence.class)}),
@@ -773,8 +762,7 @@
                     + "the direct fields in the returned provider.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "cc_infos",
             doc =
@@ -782,8 +770,7 @@
                     + "by the direct fields in the returned provider.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class)
+            defaultValue = "[]")
       })
   CcInfoApi<FileT> mergeCcInfos(
       Sequence<?> directCcInfos, // <CcInfoApi> expected
@@ -799,8 +786,7 @@
             doc = "Set of headers needed to compile this target",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "system_includes",
             doc =
@@ -809,8 +795,7 @@
                     + "root or absolute. Usually passed with -isystem",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "includes",
             doc =
@@ -818,8 +803,7 @@
                     + "Usually passed with -I",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "quote_includes",
             doc =
@@ -828,15 +812,13 @@
                     + "root or absolute. Usually passed with -iquote",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "framework_includes",
             doc = "Set of framework search paths for header files (Apple platform only)",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "defines",
             doc =
@@ -844,8 +826,7 @@
                     + " transitively to dependents.",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
         @Param(
             name = "local_defines",
             doc =
@@ -853,8 +834,7 @@
                     + " propagated transitively to dependents.",
             positional = false,
             named = true,
-            defaultValue = "unbound",
-            type = Object.class),
+            defaultValue = "unbound"),
       })
   CompilationContextT createCcCompilationContext(
       Object headers,
@@ -876,8 +856,7 @@
             name = "cc_toolchain",
             doc = "C++ toolchain provider to be used.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class)
+            named = true)
       })
   String legacyCcFlagsMakeVariable(CcToolchainProviderT ccToolchain);
 
@@ -889,7 +868,6 @@
             name = "ctx",
             positional = false,
             named = true,
-            type = StarlarkRuleContextApi.class,
             doc = "The rule context."),
       },
       doc = "Returns true if the --incompatible_enable_cc_toolchain_resolution flag is enabled.")
@@ -903,14 +881,12 @@
             name = "ctx",
             positional = false,
             named = true,
-            type = StarlarkRuleContextApi.class,
             doc = "The rule context."),
         @Param(
             name = "features",
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "A list of <a href=\"https://github.com/bazelbuild/bazel/blob/master/tools/cpp/"
                     + "cc_toolchain_config_lib.bzl#L336\">features</a>."),
@@ -919,7 +895,6 @@
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "A list of <a href=\"https://github.com/bazelbuild/bazel/blob/master/tools/cpp/"
                     + "cc_toolchain_config_lib.bzl#L461\">action_configs</a>."),
@@ -928,7 +903,6 @@
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "A list of <a href=\"https://github.com/bazelbuild/bazel/blob/master/tools/cpp/"
                     + "cc_toolchain_config_lib.bzl#L516\">artifact_name_patterns</a>."),
@@ -937,7 +911,6 @@
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "<p>Built-in include directories for C++ compilation. These should be the exact "
                     + "paths used by the compiler, and are generally relative to the exec root.</p>"
@@ -952,7 +925,6 @@
         @Param(
             name = "toolchain_identifier",
             positional = false,
-            type = String.class,
             named = true,
             doc =
                 "<p>The unique identifier of the toolchain within the crosstool release. It must "
@@ -961,43 +933,36 @@
         @Param(
             name = "host_system_name",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The system name which is required by the toolchain to run."),
         @Param(
             name = "target_system_name",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The GNU System Name."),
         @Param(
             name = "target_cpu",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The target architecture string."),
         @Param(
             name = "target_libc",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The libc version string (e.g. \"glibc-2.2.2\")."),
         @Param(
             name = "compiler",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The compiler version string (e.g. \"gcc-4.1.1\")."),
         @Param(
             name = "abi_version",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The abi in use, which is a gcc version. E.g.: \"gcc-3.4\""),
         @Param(
             name = "abi_libc_version",
             positional = false,
-            type = String.class,
             named = true,
             doc = "The glibc version used by the abi we're using."),
         @Param(
@@ -1005,7 +970,6 @@
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "A list of <a href=\"https://github.com/bazelbuild/bazel/blob/master/tools/cpp/"
                     + "cc_toolchain_config_lib.bzl#L400\">tool_paths</a>."),
@@ -1014,14 +978,12 @@
             positional = false,
             named = true,
             defaultValue = "[]",
-            type = Sequence.class,
             doc =
                 "A list of <a href=\"https://github.com/bazelbuild/bazel/blob/master/tools/cpp/"
                     + "cc_toolchain_config_lib.bzl#L86\">make_variables</a>."),
         @Param(
             name = "builtin_sysroot",
             positional = false,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)},
             named = true,
@@ -1031,7 +993,6 @@
         @Param(
             name = "cc_target_os",
             positional = false,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)},
             named = true,
@@ -1068,7 +1029,6 @@
       parameters = {
         @Param(
             name = "actions",
-            type = StarlarkActionFactoryApi.class,
             positional = false,
             named = true,
             doc = "<code>actions</code> object."),
@@ -1076,27 +1036,23 @@
             name = "feature_configuration",
             doc = "<code>feature_configuration</code> to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
+            named = true),
         @Param(
             name = "cc_toolchain",
             doc = "<code>CcToolchainInfo</code> provider to be used.",
             positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+            named = true),
         @Param(
             name = "compilation_outputs",
             doc = "Compilation outputs containing object files to link.",
             positional = false,
-            named = true,
-            type = CcCompilationOutputsApi.class),
+            named = true),
         @Param(
             name = "user_link_flags",
             doc = "Additional list of linking options.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "linking_contexts",
             doc =
@@ -1104,56 +1060,48 @@
                     + "artifact of the link() call, be it a binary or a library.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "name",
             doc =
                 "This is used for naming the output artifacts of actions created by this "
                     + "method.",
             positional = false,
-            named = true,
-            type = String.class),
+            named = true),
         @Param(
             name = "language",
             doc = "Only C++ supported for now. Do not use this parameter.",
             positional = false,
             named = true,
-            defaultValue = "'c++'",
-            type = String.class),
+            defaultValue = "'c++'"),
         @Param(
             name = "alwayslink",
             doc = "Whether this library should always be linked.",
             positional = false,
             named = true,
-            defaultValue = "False",
-            type = Boolean.class),
+            defaultValue = "False"),
         @Param(
             name = "additional_inputs",
             doc = "For additional inputs to the linking action, e.g.: linking scripts.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "disallow_static_libraries",
             doc = "Whether static libraries should be created.",
             positional = false,
             named = true,
-            defaultValue = "False",
-            type = Boolean.class),
+            defaultValue = "False"),
         @Param(
             name = "disallow_dynamic_library",
             doc = "Whether a dynamic library should be created.",
             positional = false,
             named = true,
-            defaultValue = "False",
-            type = Boolean.class),
+            defaultValue = "False"),
         @Param(
             name = "grep_includes",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = FileApi.class), @ParamType(type = NoneType.class)}),
       })
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
index c04747b..680544e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -43,8 +43,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class)
+            named = true)
       })
   boolean usePicForDynamicLibrariesFromStarlark(FeatureConfigurationT featureConfigurationApi);
 
@@ -75,8 +74,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class)
+            named = true)
       })
   public Depset getStaticRuntimeLibForStarlark(FeatureConfigurationT featureConfiguration)
       throws EvalException;
@@ -94,8 +92,7 @@
             name = "feature_configuration",
             doc = "Feature configuration to be queried.",
             positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class)
+            named = true)
       })
   public Depset getDynamicRuntimeLibForStarlark(FeatureConfigurationT featureConfiguration)
       throws EvalException;
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/DebugPackageInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/DebugPackageInfoApi.java
index 8612838..f626853 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/DebugPackageInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/DebugPackageInfoApi.java
@@ -75,29 +75,22 @@
               name = "target_label",
               doc = "The label for the *_binary target",
               positional = false,
-              named = true,
-              noneable = false,
-              allowedTypes = {@ParamType(type = Label.class)}),
+              named = true),
           @Param(
               name = "stripped_file",
               doc = "The stripped file (the explicit \".stripped\" target)",
               positional = false,
-              named = true,
-              noneable = false,
-              allowedTypes = {@ParamType(type = FileApi.class)}),
+              named = true),
           @Param(
               name = "unstripped_file",
               doc = "The unstripped file (the default executable target).",
               positional = false,
-              named = true,
-              noneable = false,
-              allowedTypes = {@ParamType(type = FileApi.class)}),
+              named = true),
           @Param(
               name = "dwp_file",
               doc = "The .dwp file (for fission builds) or null if --fission=no.",
               positional = false,
               named = true,
-              noneable = true,
               defaultValue = "None",
               allowedTypes = {@ParamType(type = FileApi.class), @ParamType(type = NoneType.class)})
         },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
index 572e8a8..d5f6a5e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
@@ -45,8 +45,7 @@
               name = "linking_context",
               doc = "The CC linking context.",
               positional = false,
-              named = true,
-              type = CcLinkingContextApi.class),
+              named = true),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
index 53aaf7e..6150d1b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/GoWrapCcHelperApi.java
@@ -72,7 +72,7 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
+        @Param(name = "ctx", positional = false, named = true),
       })
   // TODO(b/113797843): Not written in Starlark because of GoRunfilesProvider.
   public RunfilesApi starlarkGetGoRunfiles(StarlarkRuleContextT starlarkRuleContext)
@@ -83,7 +83,7 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "go", positional = false, named = true, type = GoConfigurationApi.class),
+        @Param(name = "go", positional = false, named = true),
       })
   // TODO(b/113797843): Not written in Starlark because of GoCompilationHelper.
   public int getArchIntSize(GoConfigurationT goConfig);
@@ -93,21 +93,20 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "export", positional = false, named = true, type = FileApi.class),
-        @Param(name = "pkg", positional = false, named = true, type = FileApi.class),
-        @Param(name = "gopkg", positional = false, named = true, type = FileApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "export", positional = false, named = true),
+        @Param(name = "pkg", positional = false, named = true),
+        @Param(name = "gopkg", positional = false, named = true),
         @Param(
             name = "wrap_context",
             positional = false,
             named = true,
             defaultValue = "None",
-            noneable = true,
             allowedTypes = {
               @ParamType(type = NoneType.class),
               @ParamType(type = GoContextInfoApi.class)
             }),
-        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+        @Param(name = "cc_info", positional = false, named = true),
       })
   public GoContextInfoT starlarkCollectTransitiveGoContextGopkg(
       StarlarkRuleContextT starlarkRuleContext,
@@ -122,8 +121,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_info", positional = false, named = true),
       })
   // TODO(b/113797843): GoWrapCcInfo is not written in Starlark because several native rules use it.
   public GoWrapCcInfoApi<FileT> getGoWrapCcInfo(
@@ -135,12 +134,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "linking_context",
-            positional = false,
-            named = true,
-            type = CcLinkingContextApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "linking_context", positional = false, named = true),
       })
   public GoCcLinkParamsInfoApi getGoCcLinkParamsProvider(
       StarlarkRuleContextT ruleContext, CcLinkingContextT ccLinkingContext)
@@ -151,14 +146,10 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "cc_toolchain",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(name = "srcs", positional = false, named = true, type = Sequence.class),
-        @Param(name = "deps", positional = false, named = true, type = Sequence.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
+        @Param(name = "srcs", positional = false, named = true),
+        @Param(name = "deps", positional = false, named = true),
       })
   public Tuple<FileT> createGoCompileActions(
       StarlarkRuleContextT starlarkRuleContext,
@@ -172,14 +163,10 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "cc_toolchain",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(name = "srcs", positional = false, named = true, type = Sequence.class),
-        @Param(name = "deps", positional = false, named = true, type = Sequence.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
+        @Param(name = "srcs", positional = false, named = true),
+        @Param(name = "deps", positional = false, named = true),
       })
   public Tuple<FileT> createGoCompileActionsGopkg(
       StarlarkRuleContextT starlarkRuleContext,
@@ -193,10 +180,10 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "gopkg", positional = false, named = true, type = FileApi.class),
-        @Param(name = "export", positional = false, named = true, type = FileApi.class),
-        @Param(name = "swig_out_go", positional = false, named = true, type = FileApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "gopkg", positional = false, named = true),
+        @Param(name = "export", positional = false, named = true),
+        @Param(name = "swig_out_go", positional = false, named = true),
       })
   public GoPackageInfoApi createTransitiveGopackageInfo(
       StarlarkRuleContextT starlarkRuleContext, FileT starlarkGopkg, FileT export, FileT swigOutGo);
@@ -206,8 +193,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "gopkg", positional = false, named = true, type = FileApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "gopkg", positional = false, named = true),
       })
   public Depset /*<FileT>*/ getGopackageFilesForStarlark(
       StarlarkRuleContextT starlarkRuleContext, FileT starlarkGopkg);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
index 05b5a9b..d3b354d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/PyWrapCcHelperApi.java
@@ -63,7 +63,7 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
+        @Param(name = "ctx", positional = false, named = true),
       })
   // TODO(plf): PyExtension is not in Starlark.
   public Sequence<String> getPyExtensionLinkopts(StarlarkRuleContextT starlarkRuleContext)
@@ -74,8 +74,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "py_file", positional = false, named = true, type = FileApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "py_file", positional = false, named = true),
       })
   // TODO(plf): Not written in Starlark because of PyCommon.
   public Depset getTransitivePythonSources(StarlarkRuleContextT starlarkRuleContext, FileT pyFile)
@@ -86,8 +86,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "files_to_build", positional = false, named = true, type = Depset.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "files_to_build", positional = false, named = true),
       })
   // TODO(plf): Not written in Starlark because of PythonRunfilesProvider.
   public RunfilesApi getPythonRunfiles(
@@ -99,8 +99,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_info", positional = false, named = true),
       })
   // TODO(plf): PyWrapCcInfo is not written in Starlark because several native rules use it.
   public PyWrapCcInfoApi<FileT> getPyWrapCcInfo(
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
index fe854e8..b6e8986 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/WrapCcHelperApi.java
@@ -52,12 +52,8 @@
       documented = false,
       doc = "",
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "cc_toolchain",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
       })
   public FeatureConfigurationT starlarkGetFeatureConfiguration(
       starlarkRuleContextT starlarkRuleContext, CcToolchainProviderT ccToolchain)
@@ -67,7 +63,7 @@
       name = "collect_transitive_swig_includes",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
+        @Param(name = "ctx", positional = false, named = true),
       })
   public Depset starlarkCollectTransitiveSwigIncludes(starlarkRuleContextT starlarkRuleContext);
 
@@ -75,25 +71,13 @@
       name = "create_compile_actions",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "feature_configuration",
-            positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
-        @Param(
-            name = "cc_toolchain",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(name = "cc_file", positional = false, named = true, type = FileApi.class),
-        @Param(name = "header_file", positional = false, named = true, type = FileApi.class),
-        @Param(
-            name = "dep_compilation_contexts",
-            positional = false,
-            named = true,
-            type = Sequence.class),
-        @Param(name = "target_copts", positional = false, named = true, type = Sequence.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "feature_configuration", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
+        @Param(name = "cc_file", positional = false, named = true),
+        @Param(name = "header_file", positional = false, named = true),
+        @Param(name = "dep_compilation_contexts", positional = false, named = true),
+        @Param(name = "target_copts", positional = false, named = true),
       })
   public CompilationInfoT starlarkCreateCompileActions(
       starlarkRuleContextT starlarkRuleContext,
@@ -110,7 +94,7 @@
       documented = false,
       doc = "",
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
+        @Param(name = "ctx", positional = false, named = true),
       })
   public String starlarkGetMangledTargetName(starlarkRuleContextT starlarkRuleContext)
       throws EvalException, InterruptedException;
@@ -120,8 +104,8 @@
       doc = "",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(name = "swig_includes", positional = false, named = true, type = Depset.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "swig_includes", positional = false, named = true),
       })
   // TODO(plf): Not written in Starlark because of PythonRunfilesProvider.
   public WrapCcIncludeProviderT getWrapCcIncludeProvider(
@@ -132,50 +116,34 @@
       name = "register_swig_action",
       documented = false,
       parameters = {
-        @Param(name = "ctx", positional = false, named = true, type = StarlarkRuleContextApi.class),
-        @Param(
-            name = "cc_toolchain",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(
-            name = "feature_configuration",
-            positional = false,
-            named = true,
-            noneable = false,
-            type = FeatureConfigurationApi.class),
-        @Param(
-            name = "wrapper_compilation_context",
-            positional = false,
-            named = true,
-            type = CcCompilationContextApi.class),
-        @Param(name = "swig_includes", positional = false, named = true, type = Depset.class),
-        @Param(name = "swig_source", positional = false, named = true, type = FileApi.class),
-        @Param(name = "sub_parameters", positional = false, named = true, type = Sequence.class),
-        @Param(name = "cc_file", positional = false, named = true, type = FileApi.class),
-        @Param(name = "header_file", positional = false, named = true, type = FileApi.class),
-        @Param(name = "output_files", positional = false, named = true, type = Sequence.class),
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
+        @Param(name = "feature_configuration", positional = false, named = true),
+        @Param(name = "wrapper_compilation_context", positional = false, named = true),
+        @Param(name = "swig_includes", positional = false, named = true),
+        @Param(name = "swig_source", positional = false, named = true),
+        @Param(name = "sub_parameters", positional = false, named = true),
+        @Param(name = "cc_file", positional = false, named = true),
+        @Param(name = "header_file", positional = false, named = true),
+        @Param(name = "output_files", positional = false, named = true),
         @Param(
             name = "out_dir",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)}),
         @Param(
             name = "java_dir",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)}),
-        @Param(name = "auxiliary_inputs", positional = false, named = true, type = Depset.class),
-        @Param(name = "swig_attribute_name", positional = false, named = true, type = String.class),
+        @Param(name = "auxiliary_inputs", positional = false, named = true),
+        @Param(name = "swig_attribute_name", positional = false, named = true),
         @Param(
             name = "zip_tool",
             positional = false,
             named = true,
-            noneable = true,
             defaultValue = "None",
             allowedTypes = {
               @ParamType(type = FilesToRunProviderApi.class),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
index e7e85e1..8b56ee2 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -62,33 +63,28 @@
               name = "generatingRuleLabel",
               doc = "Rule label for which this registry was built",
               positional = true,
-              named = false,
-              type = Label.class),
+              named = false),
           @Param(
               name = "isLite",
               doc = "If this registry was generated for lite or full runtime",
               positional = true,
-              named = false,
-              type = Boolean.class),
+              named = false),
           @Param(
               name = "classJar",
               doc = "Class jar generated by the registry",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "srcJar",
               doc = "Source jar generated by the registry",
               positional = true,
-              named = false,
-              type = FileApi.class),
+              named = false),
           @Param(
               name = "inputs",
               doc = "Proto jars used to generate the registry",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
index d190f4c..6fe6329 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCcLinkParamsProviderApi.java
@@ -66,12 +66,7 @@
         documented = true,
         enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_ENABLE_ANDROID_MIGRATION_APIS,
         parameters = {
-          @Param(
-              name = "store",
-              doc = "The CcInfo provider.",
-              positional = true,
-              named = false,
-              type = CcInfoApi.class),
+          @Param(name = "store", doc = "The CcInfo provider.", positional = true, named = false),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
index 5c8aabb..953d25f 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
@@ -28,6 +28,7 @@
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
@@ -59,18 +60,12 @@
               + "a provider that represents the results of the compilation and can be added to "
               + "the set of providers emitted by this rule.",
       parameters = {
-        @Param(
-            name = "ctx",
-            positional = true,
-            named = false,
-            type = StarlarkRuleContextApi.class,
-            doc = "The rule context."),
+        @Param(name = "ctx", positional = true, named = false, doc = "The rule context."),
         @Param(
             name = "source_jars",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc =
                 "A list of the jars to be compiled. At least one of source_jars or source_files"
@@ -79,43 +74,41 @@
             name = "source_files",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc =
                 "A list of the Java source files to be compiled. At least one of source_jars or "
                     + "source_files should be specified."),
-        @Param(name = "output", positional = false, named = true, type = FileApi.class),
+        @Param(name = "output", positional = false, named = true),
         @Param(
             name = "output_source_jar",
             positional = false,
             named = true,
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "The output source jar. Optional. Defaults to `{output_jar}-src.jar` if unset."),
         @Param(
             name = "javac_opts",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             defaultValue = "[]",
             doc = "A list of the desired javac options. Optional."),
         @Param(
             name = "deps",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             defaultValue = "[]",
             doc = "A list of dependencies. Optional."),
         @Param(
             name = "experimental_local_compile_time_deps",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             defaultValue = "[]",
             doc =
                 "Compile-time dependencies of the compilation that should be omitted from the"
@@ -126,32 +119,28 @@
             name = "exports",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             defaultValue = "[]",
             doc = "A list of exports. Optional."),
         @Param(
             name = "plugins",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             defaultValue = "[]",
             doc = "A list of plugins. Optional."),
         @Param(
             name = "exported_plugins",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             defaultValue = "[]",
             doc = "A list of exported plugins. Optional."),
         @Param(
             name = "annotation_processor_additional_inputs",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc =
                 "A list of inputs that the Java compilation action will take in addition to the "
@@ -160,8 +149,7 @@
             name = "annotation_processor_additional_outputs",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc =
                 "A list of outputs that the Java compilation action will output in addition to "
@@ -171,7 +159,6 @@
             defaultValue = "'ERROR'",
             positional = false,
             named = true,
-            type = String.class,
             doc =
                 "A string that specifies how to handle strict deps. Possible values: 'OFF', "
                     + "'ERROR', 'WARN' and 'DEFAULT'. For more details see "
@@ -181,17 +168,14 @@
             name = "java_toolchain",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaToolchainStarlarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to be used for this compilation. Mandatory."),
         @Param(
             name = "host_javabase",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaRuntimeInfoApi.class)},
             doc =
                 "Deprecated: You can drop this parameter (host_javabase is provided with "
                     + "java_toolchain)",
-            noneable = true,
             defaultValue = "None",
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_JAVA_COMMON_PARAMETERS,
             valueWhenDisabled = "None"),
@@ -199,22 +183,15 @@
             name = "sourcepath",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]"),
         @Param(
             name = "resources",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]"),
-        @Param(
-            name = "neverlink",
-            positional = false,
-            named = true,
-            type = Boolean.class,
-            defaultValue = "False")
+        @Param(name = "neverlink", positional = false, named = true, defaultValue = "False")
       },
       useStarlarkThread = true)
   JavaInfoT createJavaCompileAction(
@@ -249,23 +226,16 @@
               + "<code><a class=\"anchor\" href=\"JavaInfo.html\">"
               + "JavaInfo</a>#compile_jar</code>.",
       parameters = {
-        @Param(
-            name = "actions",
-            named = true,
-            type = StarlarkActionFactoryApi.class,
-            doc = "ctx.actions"),
-        @Param(
-            name = "jar",
-            positional = false,
-            named = true,
-            type = FileApi.class,
-            doc = "The jar to run ijar on."),
+        @Param(name = "actions", named = true, doc = "ctx.actions"),
+        @Param(name = "jar", positional = false, named = true, doc = "The jar to run ijar on."),
         @Param(
             name = "target_label",
             positional = false,
             named = true,
-            type = Label.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Label.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc =
                 "A target label to stamp the jar with. Used for <code>add_dep</code> support. "
@@ -275,7 +245,6 @@
             name = "java_toolchain",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaToolchainStarlarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to used to find the ijar tool."),
       })
   FileApi runIjar(
@@ -296,19 +265,16 @@
         @Param(
             name = "actions",
             named = true,
-            type = StarlarkActionFactoryApi.class,
             doc = "ctx.actions"),
         @Param(
             name = "jar",
             positional = false,
             named = true,
-            type = FileApi.class,
             doc = "The jar to run stamp_jar on."),
         @Param(
             name = "target_label",
             positional = false,
             named = true,
-            type = Label.class,
             doc =
                 "A target label to stamp the jar with. Used for <code>add_dep</code> support. "
                     + "Typically, you would pass <code>ctx.label</code> to stamp the jar "
@@ -317,7 +283,6 @@
             name = "java_toolchain",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaToolchainStarlarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to used to find the stamp_jar tool."),
       })
   FileApi stampJar(
@@ -333,17 +298,15 @@
               + "JavaInfo</a>#source_jar</code></p>."
               + "At least one of parameters output_jar or output_source_jar is required.",
       parameters = {
-        @Param(
-            name = "actions",
-            named = true,
-            type = StarlarkActionFactoryApi.class,
-            doc = "ctx.actions"),
+        @Param(name = "actions", named = true, doc = "ctx.actions"),
         @Param(
             name = "output_jar",
             positional = false,
             named = true,
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc =
                 "Deprecated: The output jar of the rule. Used to name the resulting source jar. "
@@ -355,41 +318,38 @@
             name = "output_source_jar",
             positional = false,
             named = true,
-            type = FileApi.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "The output source jar."),
         @Param(
             name = "sources",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc = "A list of Java source files to be packed into the source jar."),
         @Param(
             name = "source_jars",
             positional = false,
             named = true,
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             defaultValue = "[]",
             doc = "A list of source jars to be packed into the source jar."),
         @Param(
             name = "java_toolchain",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaToolchainStarlarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to used to find the ijar tool."),
         @Param(
             name = "host_javabase",
             positional = false,
             named = true,
-            allowedTypes = {@ParamType(type = JavaRuntimeInfoApi.class)},
             doc =
                 "Deprecated: You can drop this parameter (host_javabase is provided with "
                     + "java_toolchain)",
-            noneable = true,
             defaultValue = "None",
             disableWithFlag = BuildLanguageOptions.INCOMPATIBLE_JAVA_COMMON_PARAMETERS,
             valueWhenDisabled = "None"),
@@ -431,8 +391,7 @@
             name = "providers",
             positional = true,
             named = false,
-            type = Sequence.class,
-            generic1 = JavaInfoApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
             doc = "The list of providers to merge."),
       })
   JavaInfoT mergeJavaProviders(Sequence<?> providers /* <JavaInfoT> expected. */)
@@ -444,12 +403,7 @@
           "Returns a new Java provider whose direct-jars part is the union of both the direct and"
               + " indirect jars of the given Java provider.",
       parameters = {
-        @Param(
-            name = "java_info",
-            positional = true,
-            named = false,
-            type = JavaInfoApi.class,
-            doc = "The java info."),
+        @Param(name = "java_info", positional = true, named = false, doc = "The java info."),
       })
   JavaInfoT makeNonStrict(JavaInfoT javaInfo);
 
@@ -473,12 +427,7 @@
       name = "is_java_toolchain_resolution_enabled_do_not_use",
       documented = false,
       parameters = {
-        @Param(
-            name = "ctx",
-            positional = false,
-            named = true,
-            type = StarlarkRuleContextApi.class,
-            doc = "The rule context."),
+        @Param(name = "ctx", positional = false, named = true, doc = "The rule context."),
       },
       doc = "Returns true if --incompatible_use_toolchain_resolution_for_java_rules is enabled.")
   boolean isJavaToolchainResolutionEnabled(starlarkRuleContextT ruleContext) throws EvalException;
@@ -498,12 +447,10 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to enhance."),
         @Param(
             name = "constraints",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
@@ -521,7 +468,6 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to get constraints from."),
       },
       enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
@@ -539,7 +485,6 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to process.")
       },
       enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
@@ -553,44 +498,47 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to enhance."),
         @Param(
             name = "enabled",
-            type = Boolean.class,
             named = true,
             positional = false,
             defaultValue = "False",
             doc = "Returns true if the rule uses annotation processing."),
         @Param(
             name = "processor_classnames",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = String.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
             doc = "Class names of annotation processors applied to this rule."),
         @Param(
             name = "processor_classpath",
-            type = Depset.class,
+            allowedTypes = {
+              @ParamType(type = Depset.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc = "Class names of annotation processors applied to this rule."),
         @Param(
             name = "class_jar",
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc = "Jar file that is the result of annotation processing for this rule, or None."),
         @Param(
             name = "source_jar",
-            type = FileApi.class,
+            allowedTypes = {
+              @ParamType(type = FileApi.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            noneable = true,
             positional = false,
             defaultValue = "None",
             doc = "Source archive resulting from annotation processing of this rule, or None."),
@@ -613,7 +561,6 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to query."),
       },
       enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
@@ -627,12 +574,10 @@
             name = "java_info",
             positional = true,
             named = false,
-            type = JavaInfoApi.class,
             doc = "The JavaInfo to clone."),
         @Param(
             name = "compile_time_jdeps",
-            type = Sequence.class,
-            generic1 = FileApi.class,
+            allowedTypes = {@ParamType(type = Sequence.class, generic1 = FileApi.class)},
             named = true,
             positional = false,
             defaultValue = "[]",
@@ -647,12 +592,7 @@
       name = "java_toolchain_label",
       doc = "Returns the toolchain's label.",
       parameters = {
-        @Param(
-            name = "java_toolchain",
-            positional = true,
-            named = false,
-            type = JavaToolchainStarlarkApiProviderApi.class,
-            doc = "The toolchain."),
+        @Param(name = "java_toolchain", positional = true, named = false, doc = "The toolchain."),
       },
       enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
   Label getJavaToolchainLabel(JavaToolchainStarlarkApiProviderApi toolchain) throws EvalException;
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
index 83fd013..13ffb25 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java
@@ -21,9 +21,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 
@@ -162,16 +164,17 @@
         parameters = {
           @Param(
               name = "output_jar",
-              type = FileApi.class,
               named = true,
               doc =
                   "The jar that was created as a result of a compilation "
                       + "(e.g. javac, scalac, etc)."),
           @Param(
               name = "compile_jar",
-              type = FileApi.class,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
-              noneable = true,
               defaultValue = "None",
               doc =
                   "A jar that is added as the compile-time dependency in lieu of "
@@ -184,9 +187,11 @@
                       + "you can simply pass <code>output_jar</code>."),
           @Param(
               name = "source_jar",
-              type = FileApi.class,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
-              noneable = true,
               defaultValue = "None",
               doc =
                   "The source jar that was used to create the output jar. "
@@ -194,28 +199,24 @@
                       + "pack_sources</a></code> to produce this source jar."),
           @Param(
               name = "neverlink",
-              type = Boolean.class,
               named = true,
               defaultValue = "False",
               doc = "If true only use this library for compilation and not at runtime."),
           @Param(
               name = "deps",
-              type = Sequence.class,
-              generic1 = JavaInfoApi.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
               named = true,
               defaultValue = "[]",
               doc = "Compile time dependencies that were used to create the output jar."),
           @Param(
               name = "runtime_deps",
-              type = Sequence.class,
-              generic1 = JavaInfoApi.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
               named = true,
               defaultValue = "[]",
               doc = "Runtime dependencies that are needed for this library."),
           @Param(
               name = "exports",
-              type = Sequence.class,
-              generic1 = JavaInfoApi.class,
+              allowedTypes = {@ParamType(type = Sequence.class, generic1 = JavaInfoApi.class)},
               named = true,
               defaultValue = "[]",
               doc =
@@ -224,10 +225,12 @@
                       + "master/be/java.html#java_library.exports\">java_library.exports</a>."),
           @Param(
               name = "jdeps",
-              type = FileApi.class,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               named = true,
               defaultValue = "None",
-              noneable = true,
               doc =
                   "jdeps information for the rule output (if available). This should be a binary"
                       + " proto encoded using the deps.proto protobuf included with Bazel.  If"
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
index 501ad5a..7719fd9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaNativeLibraryInfoApi.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.LibraryToLinkApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -72,8 +73,7 @@
               doc = "The transitive set of LibraryToLink providers.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = LibraryToLinkApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = LibraryToLinkApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
index f0bf9c7..946d333 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaProtoCommonApi.java
@@ -38,30 +38,11 @@
       // This function is experimental for now.
       documented = false,
       parameters = {
-        @Param(
-            name = "ctx",
-            positional = true,
-            named = false,
-            type = StarlarkRuleContextApi.class,
-            doc = "The rule context."),
-        @Param(
-            name = "target",
-            positional = true,
-            named = false,
-            type = TransitiveInfoCollectionApi.class,
-            doc = "The target."),
-        @Param(name = "src_jar", positional = false, named = true, type = FileApi.class),
-        @Param(
-            name = "proto_toolchain_attr",
-            positional = false,
-            named = true,
-            type = String.class),
-        @Param(
-            name = "flavour",
-            positional = false,
-            named = true,
-            type = String.class,
-            defaultValue = "'java'")
+        @Param(name = "ctx", positional = true, named = false, doc = "The rule context."),
+        @Param(name = "target", positional = true, named = false, doc = "The target."),
+        @Param(name = "src_jar", positional = false, named = true),
+        @Param(name = "proto_toolchain_attr", positional = false, named = true),
+        @Param(name = "flavour", positional = false, named = true, defaultValue = "'java'"),
       })
   void createProtoCompileAction(
       StarlarkRuleContextT starlarkRuleContext,
@@ -82,7 +63,6 @@
             name = "target",
             positional = true,
             named = false,
-            type = TransitiveInfoCollectionApi.class,
             doc = "The proto_library target."),
       })
   boolean hasProtoSources(TransitiveInfoCollectionT target);
@@ -92,13 +72,8 @@
       // This function is experimental for now.
       documented = false,
       parameters = {
-        @Param(
-            name = "ctx",
-            positional = true,
-            named = false,
-            type = StarlarkRuleContextApi.class,
-            doc = "The rule context."),
-        @Param(name = "proto_toolchain_attr", positional = false, named = true, type = String.class)
+        @Param(name = "ctx", positional = true, named = false, doc = "The rule context."),
+        @Param(name = "proto_toolchain_attr", positional = false, named = true)
       })
   JavaInfoApi<FileT> getRuntimeToolchainProvider(
       StarlarkRuleContextT starlarkRuleContext, String protoToolchainAttr) throws EvalException;
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
index c136e75..1134b08 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/ProguardSpecProviderApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -49,8 +50,7 @@
               doc = "Transitive proguard specs.",
               positional = true,
               named = false,
-              type = Depset.class,
-              generic1 = FileApi.class),
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)}),
         },
         selfCall = true)
     @StarlarkConstructor
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
index 98457c5..a277d30 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/javascript/JsModuleInfoApi.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -67,36 +68,33 @@
               name = "label",
               doc = "The label of the target which created this object",
               positional = false,
-              named = true,
-              type = Label.class),
+              named = true),
           @Param(
               name = "wrapper",
               doc = "A string in which the output should be embedded.",
               positional = false,
-              named = true,
-              type = String.class),
+              named = true),
           @Param(
               name = "full_pinto_sources",
               doc =
                   "PintoSourcesContextProvider for this module and the transitive closure of"
                       + " dependencies.",
               positional = false,
-              named = true,
-              type = Object.class),
+              named = true),
           @Param(
               name = "direct_pinto_sources",
               doc = "PintoSourcesContextProvider for only this module.",
               positional = false,
-              named = true,
-              type = Object.class),
+              named = true),
           @Param(
               name = "direct_module_dependencies",
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = JsModuleInfoApi.class),
+              },
               doc = "A list of direct module dependencies of this module.",
               positional = false,
               named = true,
-              defaultValue = "[]",
-              type = Sequence.class,
-              generic1 = JsModuleInfoApi.class),
+              defaultValue = "[]"),
         },
         selfCall = true,
         enableOnlyWithFlag = BuildLanguageOptions.EXPERIMENTAL_GOOGLE_LEGACY_API)
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
index f6aab08..be267d9 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/ConstraintCollectionApi.java
@@ -50,7 +50,6 @@
       parameters = {
         @Param(
             name = "constraint",
-            type = ConstraintSettingInfoApi.class,
             named = true,
             doc = "The constraint setting to fetch the value for.")
       },
@@ -64,7 +63,6 @@
       parameters = {
         @Param(
             name = "constraint",
-            type = ConstraintSettingInfoApi.class,
             named = true,
             doc = "The constraint setting to check.")
       },
@@ -77,7 +75,6 @@
       parameters = {
         @Param(
             name = "constraint_value",
-            type = ConstraintValueInfoApi.class,
             named = true,
             doc = "The constraint value to check.")
       },
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
index f592b7c..2b9e687 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform/PlatformInfoApi.java
@@ -22,10 +22,12 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
 import java.util.Map;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkThread;
 
@@ -92,33 +94,37 @@
         parameters = {
           @Param(
               name = "label",
-              type = Label.class,
               named = true,
               positional = false,
               doc = "The label for this platform."),
           @Param(
               name = "parent",
-              type = PlatformInfoApi.class,
+              allowedTypes = {
+                @ParamType(type = PlatformInfoApi.class),
+                @ParamType(type = NoneType.class),
+              },
               defaultValue = "None",
               named = true,
               positional = false,
-              noneable = true,
               doc = "The parent of this platform."),
           @Param(
               name = "constraint_values",
-              type = Sequence.class,
+              allowedTypes = {
+                @ParamType(type = Sequence.class, generic1 = ConstraintValueInfoApi.class),
+              },
               defaultValue = "[]",
-              generic1 = ConstraintValueInfoApi.class,
               named = true,
               positional = false,
               doc = "The constraint values for the platform"),
           @Param(
               name = "exec_properties",
-              type = Dict.class,
+              allowedTypes = {
+                @ParamType(type = Dict.class),
+                @ParamType(type = NoneType.class),
+              },
               defaultValue = "None",
               named = true,
               positional = false,
-              noneable = true,
               doc = "The exec properties for the platform.")
         },
         selfCall = true,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
index 9169da7..54d3300 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyInfoApi.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
@@ -86,36 +87,31 @@
         parameters = {
           @Param(
               name = "transitive_sources",
-              type = Depset.class,
-              generic1 = FileApi.class,
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = FileApi.class)},
               positional = false,
               named = true,
               doc = "The value for the new object's <code>transitive_sources</code> field."),
           @Param(
               name = "uses_shared_libraries",
-              type = Boolean.class,
               positional = false,
               named = true,
               defaultValue = "False",
               doc = "The value for the new object's <code>uses_shared_libraries</code> field."),
           @Param(
               name = "imports",
-              type = Depset.class,
-              generic1 = String.class,
+              allowedTypes = {@ParamType(type = Depset.class, generic1 = String.class)},
               positional = false,
               named = true,
               defaultValue = "unbound",
               doc = "The value for the new object's <code>imports</code> field."),
           @Param(
               name = "has_py2_only_sources",
-              type = Boolean.class,
               positional = false,
               named = true,
               defaultValue = "False",
               doc = "The value for the new object's <code>has_py2_only_sources</code> field."),
           @Param(
               name = "has_py3_only_sources",
-              type = Boolean.class,
               positional = false,
               named = true,
               defaultValue = "False",
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
index 4c6b6b0..090588b 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/python/PyRuntimeInfoApi.java
@@ -21,9 +21,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.core.ProviderApi;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -96,8 +98,10 @@
         parameters = {
           @Param(
               name = "interpreter_path",
-              type = String.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = NoneType.class),
+              },
               positional = false,
               named = true,
               defaultValue = "None",
@@ -106,8 +110,10 @@
                       + "a value for this argument if you pass in <code>interpreter</code>."),
           @Param(
               name = "interpreter",
-              type = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               positional = false,
               named = true,
               defaultValue = "None",
@@ -116,9 +122,10 @@
                       + "a value for this argument if you pass in <code>interpreter_path</code>."),
           @Param(
               name = "files",
-              type = Depset.class,
-              generic1 = FileApi.class,
-              noneable = true,
+              allowedTypes = {
+                @ParamType(type = Depset.class, generic1 = FileApi.class),
+                @ParamType(type = NoneType.class),
+              },
               positional = false,
               named = true,
               defaultValue = "None",
@@ -129,7 +136,6 @@
                       + "<code>files</code> becomes an empty <code>depset</code> instead."),
           @Param(
               name = "python_version",
-              type = String.class,
               positional = false,
               named = true,
               doc = "The value for the new object's <code>python_version</code> field."),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
index cc482ac..cb9268c 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryModuleApi.java
@@ -17,9 +17,11 @@
 import com.google.devtools.build.docgen.annot.DocumentMethods;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkCallable;
 import net.starlark.java.eval.StarlarkThread;
@@ -39,7 +41,6 @@
       parameters = {
         @Param(
             name = "implementation",
-            type = StarlarkCallable.class,
             named = true,
             doc =
                 "the function that implements this rule. Must have a single parameter,"
@@ -48,8 +49,10 @@
                     + " rule."),
         @Param(
             name = "attrs",
-            type = Dict.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = Dict.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc =
                 "dictionary to declare all the attributes of the rule. It maps from an attribute "
@@ -62,7 +65,6 @@
             positional = false),
         @Param(
             name = "local",
-            type = Boolean.class,
             defaultValue = "False",
             doc =
                 "Indicate that this rule fetches everything from the local system and should be "
@@ -71,8 +73,9 @@
             positional = false),
         @Param(
             name = "environ",
-            type = Sequence.class,
-            generic1 = String.class,
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+            },
             defaultValue = "[]",
             doc =
                 "Provides a list of environment variable that this repository rule depends on. If "
@@ -82,14 +85,12 @@
             positional = false),
         @Param(
             name = "configure",
-            type = Boolean.class,
             defaultValue = "False",
             doc = "Indicate that the repository inspects the system for configuration purpose",
             named = true,
             positional = false),
         @Param(
             name = "remotable",
-            type = Boolean.class,
             defaultValue = "False",
             doc = "Compatible with remote execution",
             named = true,
@@ -98,7 +99,6 @@
             valueWhenDisabled = "False"),
         @Param(
             name = "doc",
-            type = String.class,
             defaultValue = "''",
             doc =
                 "A description of the repository rule that can be extracted by documentation "
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
index 62e5453..baea500 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/RepositoryPathApi.java
@@ -56,7 +56,6 @@
             name = "child_path",
             positional = true,
             named = false,
-            type = String.class,
             doc = "The path to append to this path."),
       })
   RepositoryPathApi<?> getChild(String childPath);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
index 109f2ca..b362cfb 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/repository/StarlarkRepositoryContextApi.java
@@ -126,20 +126,17 @@
             doc = "path of the file to create, relative to the repository directory."),
         @Param(
             name = "content",
-            type = String.class,
             named = true,
             defaultValue = "''",
             doc = "the content of the file to create, empty by default."),
         @Param(
             name = "executable",
             named = true,
-            type = Boolean.class,
             defaultValue = "True",
             doc = "set the executable flag on the created file, true by default."),
         @Param(
             name = "legacy_utf8",
             named = true,
-            type = Boolean.class,
             defaultValue = "True",
             doc =
                 "encode file content to UTF-8, true by default. Future versions will change"
@@ -177,13 +174,11 @@
             doc = "path to the template file."),
         @Param(
             name = "substitutions",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc = "substitutions to make when expanding the template."),
         @Param(
             name = "executable",
-            type = Boolean.class,
             defaultValue = "True",
             named = true,
             doc = "set the executable flag on the created file, true by default."),
@@ -231,7 +226,6 @@
       parameters = {
         @Param(
             name = "arguments",
-            type = Sequence.class,
             doc =
                 "List of arguments, the first element should be the path to the program to "
                     + "execute."),
@@ -242,19 +236,16 @@
             doc = "maximum duration of the command in seconds (default is 600 seconds)."),
         @Param(
             name = "environment",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc = "force some environment variables to be set to be passed to the process."),
         @Param(
             name = "quiet",
-            type = Boolean.class,
             defaultValue = "True",
             named = true,
             doc = "If stdout and stderr should be printed to the terminal."),
         @Param(
             name = "working_directory",
-            type = String.class,
             defaultValue = "\"\"",
             named = true,
             doc =
@@ -328,11 +319,7 @@
       allowReturnNones = true,
       useStarlarkThread = true,
       parameters = {
-        @Param(
-            name = "program",
-            type = String.class,
-            named = false,
-            doc = "Program to find in the path."),
+        @Param(name = "program", named = false, doc = "Program to find in the path."),
       })
   RepositoryPathApi<?> which(String program, StarlarkThread thread) throws EvalException;
 
@@ -364,7 +351,6 @@
             doc = "path to the output file, relative to the repository directory."),
         @Param(
             name = "sha256",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -375,13 +361,11 @@
                     + " easier but should be set before shipping."),
         @Param(
             name = "executable",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc = "set the executable flag on the created file, false by default."),
         @Param(
             name = "allow_fail",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -389,7 +373,6 @@
                     + " instead of raising an error for failed downloads"),
         @Param(
             name = "canonical_id",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -397,13 +380,11 @@
                     + " with the same canonical id"),
         @Param(
             name = "auth",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc = "An optional dict specifying authentication information for some of the URLs."),
         @Param(
             name = "integrity",
-            type = String.class,
             defaultValue = "''",
             named = true,
             positional = false,
@@ -456,7 +437,6 @@
                     + " relative to the repository directory."),
         @Param(
             name = "stripPrefix",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -499,7 +479,6 @@
                     + " relative to the repository directory."),
         @Param(
             name = "sha256",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -514,7 +493,6 @@
                     + " cache."),
         @Param(
             name = "type",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -525,7 +503,6 @@
                     + " \"jar\", \"war\", \"tar.gz\", \"tgz\", \"tar.bz2\", or \"tar.xz\" here."),
         @Param(
             name = "stripPrefix",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -536,7 +513,6 @@
                     + " files."),
         @Param(
             name = "allow_fail",
-            type = Boolean.class,
             defaultValue = "False",
             named = true,
             doc =
@@ -544,7 +520,6 @@
                     + " instead of raising an error for failed downloads"),
         @Param(
             name = "canonical_id",
-            type = String.class,
             defaultValue = "''",
             named = true,
             doc =
@@ -552,13 +527,11 @@
                     + " with the same canonical id"),
         @Param(
             name = "auth",
-            type = Dict.class,
             defaultValue = "{}",
             named = true,
             doc = "An optional dict specifying authentication information for some of the URLs."),
         @Param(
             name = "integrity",
-            type = String.class,
             defaultValue = "''",
             named = true,
             positional = false,
@@ -590,7 +563,7 @@
       useStarlarkThread = true,
       documented = false,
       parameters = {
-        @Param(name = "flag", type = String.class, doc = "Flag to get the value for."),
+        @Param(name = "flag", doc = "Flag to get the value for."),
       })
   boolean flagEnabled(String flag, StarlarkThread starlarkThread) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
index 59f6312..a90f370 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/AnalysisTestResultInfoApi.java
@@ -59,14 +59,12 @@
         parameters = {
           @Param(
               name = "success",
-              type = Boolean.class,
               named = true,
               doc =
                   "If true, then the analysis-phase test represented by this target should "
                       + "pass. If false, the test should fail."),
           @Param(
               name = "message",
-              type = String.class,
               named = true,
               doc =
                   "A descriptive message containing information about the test and its "
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
index bb04ace..259910e 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/CoverageCommonApi.java
@@ -17,9 +17,11 @@
 import com.google.devtools.build.lib.starlarkbuildapi.StarlarkRuleContextApi;
 import com.google.devtools.build.lib.starlarkbuildapi.platform.ConstraintValueInfoApi;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -40,19 +42,13 @@
               + "instance. Use this provider to communicate coverage-related attributes of the "
               + "current build rule.",
       parameters = {
-        @Param(
-            name = "ctx",
-            positional = true,
-            named = true,
-            type = StarlarkRuleContextApi.class,
-            doc = "The rule context."),
+        @Param(name = "ctx", positional = true, named = true, doc = "The rule context."),
         @Param(
             name = "source_attributes",
             doc = "A list of attribute names which contain source files processed by this rule.",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "dependency_attributes",
             doc =
@@ -60,10 +56,13 @@
                     + "dependencies or runfiles).",
             positional = false,
             named = true,
-            defaultValue = "[]",
-            type = Sequence.class),
+            defaultValue = "[]"),
         @Param(
             name = "extensions",
+            allowedTypes = {
+              @ParamType(type = Sequence.class, generic1 = String.class),
+              @ParamType(type = NoneType.class),
+            },
             doc =
                 "File extensions used to filter files from source_attributes. For example, 'js'. "
                     + "If not provided (or None), then all files from source_attributes will be "
@@ -71,9 +70,7 @@
                     + "no files from source attributes will be added.",
             positional = false,
             named = true,
-            noneable = true,
-            defaultValue = "None",
-            type = Sequence.class),
+            defaultValue = "None"),
       })
   InstrumentedFilesInfoApi instrumentedFilesInfo(
       RuleContextT starlarkRuleContext,
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
index c63d515..a6f243a 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/test/TestingModuleApi.java
@@ -36,7 +36,6 @@
       parameters = {
         @Param(
             name = "requirements",
-            type = Dict.class,
             named = false,
             positional = true,
             doc =
@@ -57,7 +56,6 @@
       parameters = {
         @Param(
             name = "environment",
-            type = Dict.class,
             named = false,
             positional = true,
             doc =
diff --git a/src/main/java/net/starlark/java/annot/Param.java b/src/main/java/net/starlark/java/annot/Param.java
index 210477c..25fbd6d 100644
--- a/src/main/java/net/starlark/java/annot/Param.java
+++ b/src/main/java/net/starlark/java/annot/Param.java
@@ -46,51 +46,16 @@
   String defaultValue() default "";
 
   /**
-   * Type of the parameter, e.g. {@link String}.class or {@link
-   * net.starlark.java.eval.Sequence}.class. May not be used in conjunction with {@link
-   * #allowedTypes}. Specifying neither {@code type} nor {@code allowedTypes} is equivalent to
-   * specifying the class of the parameter variable.
-   */
-  // Deprecated. Use allowedTypes.
-  Class<?> type() default Void.class;
-
-  /**
    * List of allowed types for the parameter.
    *
    * <p>The array may be omitted, in which case the parameter accepts any value whose class is
    * assignable to the class of the parameter variable.
    *
-   * <p>If a function should accept None, NoneType should be in this list. (Currently one may set
-   * {@link #noneable} to achieve the same effect, but it is going away.)
-   *
-   * <p>May not be used in conjunction with {@link #type}.
+   * <p>If a function should accept None, NoneType should be in this list.
    */
   ParamType[] allowedTypes() default {};
 
   /**
-   * When {@link #type()} is a generic type (e.g., {@link net.starlark.java.eval.Sequence}), specify
-   * the type parameter (e.g. {@link String}.class} along with {@link
-   * net.starlark.java.eval.Sequence} for {@link #type()} to specify a list of strings).
-   *
-   * <p>This is only used for documentation generation. The actual generic type is not checked at
-   * runtime, so the Java method signature should use a generic type of Object and cast
-   * appropriately.
-   */
-  // Deprecated. Use allowedTypes.
-  Class<?> generic1() default Object.class;
-
-  /**
-   * Indicates whether this parameter accepts {@code None} as a value, even if NoneType was not
-   * among {@link #allowedTypes}.
-   *
-   * <p>If true, {@code None} is accepted as a valid input in addition to the types mentioned by
-   * {@link #type} or {@link #allowedTypes}. In this case, the Java type of the corresponding method
-   * parameter must be {@code Object}.
-   */
-  // Deprecated. Use allowedTypes={..., @ParamType(type=NoneType)}.
-  boolean noneable() default false;
-
-  /**
    * If true, the parameter may be specified as a named parameter. For example for an integer named
    * parameter {@code foo} of a method {@code bar}, then the method call will look like {@code
    * bar(foo=1)}.
diff --git a/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java b/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
index 7227937..5b8ebcc 100644
--- a/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
+++ b/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
@@ -237,9 +237,6 @@
   private void checkParameters(ExecutableElement method, StarlarkMethod annot) {
     List<? extends VariableElement> params = method.getParameters();
 
-    TypeMirror objectType = getType("java.lang.Object");
-    TypeMirror voidType = getType("java.lang.Void");
-
     boolean allowPositionalNext = true;
     boolean allowPositionalOnlyNext = true;
     boolean allowNonDefaultPositionalNext = true;
@@ -259,7 +256,7 @@
       }
       VariableElement param = params.get(i);
 
-      checkParameter(param, paramAnnot, objectType, voidType);
+      checkParameter(param, paramAnnot);
 
       // Check parameter ordering.
       if (paramAnnot.positional()) {
@@ -305,8 +302,7 @@
   }
 
   // Checks consistency of a single parameter with its Param annotation.
-  private void checkParameter(
-      Element param, Param paramAnnot, TypeMirror objectType, TypeMirror voidType) {
+  private void checkParameter(Element param, Param paramAnnot) {
     TypeMirror paramType = param.asType(); // type of the Java method parameter
 
     // Give helpful hint for parameter of type Integer.
@@ -318,32 +314,6 @@
           paramAnnot.name());
     }
 
-    // Check param.type.
-    if (!types.isSameType(getParamType(paramAnnot), voidType)) {
-      // Reject Param.type if not assignable to parameter variable.
-      TypeMirror t = getParamType(paramAnnot);
-      if (!types.isAssignable(t, types.erasure(paramType))) {
-        errorf(
-            param,
-            "annotated type %s of parameter '%s' is not assignable to variable of type %s",
-            t,
-            paramAnnot.name(),
-            paramType);
-      }
-
-      // Reject the combination of Param.type and Param.allowed_types.
-      if (paramAnnot.allowedTypes().length > 0) {
-        errorf(
-            param,
-            "Parameter '%s' has both 'type' and 'allowedTypes' specified. Only one may be"
-                + " specified.",
-            paramAnnot.name());
-      }
-    }
-
-    TypeMirror noneType = getType("net.starlark.java.eval.NoneType");
-    boolean allowsNoneType = false;
-
     // Reject an entry of Param.allowedTypes if not assignable to the parameter variable.
     for (ParamType paramTypeAnnot : paramAnnot.allowedTypes()) {
       TypeMirror t = getParamTypeType(paramTypeAnnot);
@@ -356,9 +326,6 @@
             paramAnnot.name(),
             paramType);
       }
-      if (types.isSameType(t, noneType)) {
-        allowsNoneType = true;
-      }
     }
 
     // Reject generic types C<T> other than C<?>,
@@ -378,26 +345,6 @@
       }
     }
 
-    // A "noneable" parameter variable must accept the value None.
-    // A parameter whose default is None must be noneable.
-    if (paramAnnot.noneable()) {
-      if (!types.isSameType(paramType, objectType)) {
-        errorf(
-            param,
-            "Expected type 'Object' but got type '%s' for noneable parameter '%s'. The argument"
-                + " for a noneable parameter may be None, so the java parameter must be"
-                + " compatible with the type of None as well as possible non-None values.",
-            paramType,
-            param.getSimpleName());
-      }
-    } else if (paramAnnot.defaultValue().equals("None") && !allowsNoneType) {
-      errorf(
-          param,
-          "Parameter '%s' has 'None' default value but is not noneable. (If this is intended"
-              + " as a mandatory parameter, leave the defaultValue field empty)",
-          paramAnnot.name());
-    }
-
     // Check sense of flag-controlled parameters.
     boolean hasFlag = false;
     if (!paramAnnot.enableOnlyWithFlag().isEmpty()) {
@@ -433,18 +380,6 @@
     return s.charAt(0) == '-' || s.charAt(0) == '+';
   }
 
-  // Returns the logical type of Param.type.
-  private static TypeMirror getParamType(Param param) {
-    // See explanation of this hack at Element.getAnnotation
-    // and at https://stackoverflow.com/a/10167558.
-    try {
-      param.type();
-      throw new IllegalStateException("unreachable");
-    } catch (MirroredTypeException ex) {
-      return ex.getTypeMirror();
-    }
-  }
-
   // Returns the logical type of ParamType.type.
   private static TypeMirror getParamTypeType(ParamType paramType) {
     // See explanation of this hack at Element.getAnnotation
diff --git a/src/main/java/net/starlark/java/eval/Dict.java b/src/main/java/net/starlark/java/eval/Dict.java
index 1c25717..d415474 100644
--- a/src/main/java/net/starlark/java/eval/Dict.java
+++ b/src/main/java/net/starlark/java/eval/Dict.java
@@ -169,11 +169,10 @@
               + "else <code>default</code>. If <code>default</code> is not given, it defaults to "
               + "<code>None</code>, so that this method never throws an error.",
       parameters = {
-        @Param(name = "key", noneable = true, doc = "The key to look for."),
+        @Param(name = "key", doc = "The key to look for."),
         @Param(
             name = "default",
             defaultValue = "None",
-            noneable = true,
             named = true,
             doc = "The default value to use (instead of None) if the key is not found.")
       },
@@ -204,13 +203,11 @@
               + "If no entry with that key was found, remove nothing and return the specified "
               + "<code>default</code> value; if no default value was specified, fail instead.",
       parameters = {
-        @Param(name = "key", type = Object.class, doc = "The key.", noneable = true),
+        @Param(name = "key", doc = "The key."),
         @Param(
             name = "default",
-            type = Object.class,
             defaultValue = "unbound",
             named = true,
-            noneable = true,
             doc = "a default value if the key is absent."),
       },
       useStarlarkThread = true)
@@ -254,13 +251,11 @@
               + "and return <code>default</code>. "
               + "<code>default</code> defaults to <code>None</code>.",
       parameters = {
-        @Param(name = "key", type = Object.class, doc = "The key."),
+        @Param(name = "key", doc = "The key."),
         @Param(
             name = "default",
-            type = Object.class,
             defaultValue = "None",
             named = true,
-            noneable = true,
             doc = "a default value if the key is absent."),
       })
   @SuppressWarnings("unchecked") // Cast of value to V
@@ -290,7 +285,6 @@
       parameters = {
         @Param(
             name = "args",
-            type = Object.class,
             defaultValue = "[]",
             doc =
                 "Either a dictionary or a list of entries. Entries must be tuples or lists with "
diff --git a/src/main/java/net/starlark/java/eval/MethodLibrary.java b/src/main/java/net/starlark/java/eval/MethodLibrary.java
index a908636..fff7679 100644
--- a/src/main/java/net/starlark/java/eval/MethodLibrary.java
+++ b/src/main/java/net/starlark/java/eval/MethodLibrary.java
@@ -29,6 +29,7 @@
 import java.util.NoSuchElementException;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 
@@ -89,13 +90,7 @@
               + "Elements are converted to boolean using the <a href=\"#bool\">bool</a> function."
               + "<pre class=\"language-python\">all([\"hello\", 3, True]) == True\n"
               + "all([-1, 0, 1]) == False</pre>",
-      parameters = {
-        @Param(
-            name = "elements",
-            type = Object.class,
-            noneable = true,
-            doc = "A string or a collection of elements.")
-      })
+      parameters = {@Param(name = "elements", doc = "A string or a collection of elements.")})
   public Boolean all(Object collection) throws EvalException {
     return !hasElementWithBooleanValue(collection, false);
   }
@@ -107,13 +102,7 @@
               + "Elements are converted to boolean using the <a href=\"#bool\">bool</a> function."
               + "<pre class=\"language-python\">any([-1, 0, 1]) == True\n"
               + "any([False, 0, \"\"]) == False</pre>",
-      parameters = {
-        @Param(
-            name = "elements",
-            type = Object.class,
-            noneable = true,
-            doc = "A string or a collection of elements.")
-      })
+      parameters = {@Param(name = "elements", doc = "A string or a collection of elements.")})
   public Boolean any(Object collection) throws EvalException {
     return hasElementWithBooleanValue(collection, true);
   }
@@ -136,17 +125,15 @@
               + "It is an error if elements are not comparable (for example int with string)."
               + "<pre class=\"language-python\">sorted([3, 5, 4]) == [3, 4, 5]</pre>",
       parameters = {
-        @Param(name = "iterable", type = Object.class, doc = "The iterable sequence to sort."),
+        @Param(name = "iterable", doc = "The iterable sequence to sort."),
         @Param(
             name = "key",
             doc = "An optional function applied to each element before comparison.",
             named = true,
             defaultValue = "None",
-            positional = false,
-            noneable = true),
+            positional = false),
         @Param(
             name = "reverse",
-            type = Boolean.class,
             doc = "Return results in descending order.",
             named = true,
             defaultValue = "False",
@@ -240,10 +227,7 @@
           "Returns a list that contains the elements of the original sequence in reversed order."
               + "<pre class=\"language-python\">reversed([3, 5, 4]) == [4, 5, 3]</pre>",
       parameters = {
-        @Param(
-            name = "sequence",
-            type = Sequence.class,
-            doc = "The sequence (list or tuple) to be reversed."),
+        @Param(name = "sequence", doc = "The sequence (list or tuple) to be reversed."),
       },
       useStarlarkThread = true)
   public StarlarkList<?> reversed(Sequence<?> sequence, StarlarkThread thread)
@@ -302,7 +286,7 @@
           "Converts any object to string. This is useful for debugging."
               + "<pre class=\"language-python\">str(\"ab\") == \"ab\"\n"
               + "str(8) == \"8\"</pre>",
-      parameters = {@Param(name = "x", doc = "The object to convert.", noneable = true)})
+      parameters = {@Param(name = "x", doc = "The object to convert.")})
   public String str(Object x) throws EvalException {
     return Starlark.str(x);
   }
@@ -312,7 +296,7 @@
       doc =
           "Converts any object to a string representation. This is useful for debugging.<br>"
               + "<pre class=\"language-python\">repr(\"ab\") == '\"ab\"'</pre>",
-      parameters = {@Param(name = "x", doc = "The object to convert.", noneable = true)})
+      parameters = {@Param(name = "x", doc = "The object to convert.")})
   public String repr(Object x) {
     return Starlark.repr(x);
   }
@@ -325,13 +309,7 @@
               + "</code>, an empty string (<code>\"\"</code>), the number <code>0</code>, or an "
               + "empty collection (e.g. <code>()</code>, <code>[]</code>). "
               + "Otherwise, it returns <code>True</code>.",
-      parameters = {
-        @Param(
-            name = "x",
-            defaultValue = "False",
-            doc = "The variable to convert.",
-            noneable = true)
-      })
+      parameters = {@Param(name = "x", defaultValue = "False", doc = "The variable to convert.")})
   public Boolean bool(Object x) throws EvalException {
     return Starlark.truth(x);
   }
@@ -379,10 +357,9 @@
               + "int(\"-0x10\", 0) == -16"
               + "</pre>",
       parameters = {
-        @Param(name = "x", type = Object.class, doc = "The string to convert."),
+        @Param(name = "x", doc = "The string to convert."),
         @Param(
             name = "base",
-            type = StarlarkInt.class,
             defaultValue = "unbound",
             doc =
                 "The base used to interpret a string value; defaults to 10. Must be between 2 "
@@ -501,7 +478,6 @@
       parameters = {
         @Param(
             name = "args",
-            type = Object.class,
             defaultValue = "[]",
             doc =
                 "Either a dictionary or a list of entries. Entries must be tuples or lists with "
@@ -527,13 +503,8 @@
       parameters = {
         // Note Python uses 'sequence' keyword instead of 'list'. We may want to change tihs
         // some day.
-        @Param(name = "list", type = Object.class, doc = "input sequence.", named = true),
-        @Param(
-            name = "start",
-            type = StarlarkInt.class,
-            doc = "start index.",
-            defaultValue = "0",
-            named = true)
+        @Param(name = "list", doc = "input sequence.", named = true),
+        @Param(name = "start", doc = "start index.", defaultValue = "0", named = true),
       },
       useStarlarkThread = true)
   public StarlarkList<?> enumerate(Object input, StarlarkInt startI, StarlarkThread thread)
@@ -556,7 +527,7 @@
       // Deterministic hashing is important for the consistency of builds, hence why we
       // promise a specific algorithm. This is in contrast to Java (Object.hashCode()) and
       // Python, which promise stable hashing only within a given execution of the program.
-      parameters = {@Param(name = "value", type = String.class, doc = "String value to hash.")})
+      parameters = {@Param(name = "value", doc = "String value to hash.")})
   public Integer hash(String value) throws EvalException {
     return value.hashCode();
   }
@@ -573,21 +544,21 @@
       parameters = {
         @Param(
             name = "start_or_stop",
-            type = StarlarkInt.class,
             doc =
                 "Value of the start element if stop is provided, "
                     + "otherwise value of stop and the actual start is 0"),
         @Param(
             name = "stop_or_none",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc =
                 "optional index of the first item <i>not</i> to be included in the resulting "
                     + "list; generation of the list stops before <code>stop</code> is reached."),
         @Param(
             name = "step",
-            type = StarlarkInt.class,
             defaultValue = "1",
             doc = "The increment (default is 1). It may be negative.")
       },
@@ -620,8 +591,8 @@
               + "<code>name</code>, otherwise False. Example:<br>"
               + "<pre class=\"language-python\">hasattr(ctx.attr, \"myattr\")</pre>",
       parameters = {
-        @Param(name = "x", doc = "The object to check.", noneable = true),
-        @Param(name = "name", type = String.class, doc = "The name of the attribute.")
+        @Param(name = "x", doc = "The object to check."),
+        @Param(name = "name", doc = "The name of the attribute.")
       },
       useStarlarkThread = true)
   public Boolean hasattr(Object obj, String name, StarlarkThread thread) throws EvalException {
@@ -637,15 +608,14 @@
               + "<pre class=\"language-python\">getattr(ctx.attr, \"myattr\")\n"
               + "getattr(ctx.attr, \"myattr\", \"mydefault\")</pre>",
       parameters = {
-        @Param(name = "x", doc = "The struct whose attribute is accessed.", noneable = true),
+        @Param(name = "x", doc = "The struct whose attribute is accessed."),
         @Param(name = "name", doc = "The name of the struct attribute."),
         @Param(
             name = "default",
             defaultValue = "unbound",
             doc =
                 "The default value to return in case the struct "
-                    + "doesn't have an attribute of the given name.",
-            noneable = true)
+                    + "doesn't have an attribute of the given name.")
       },
       useStarlarkThread = true)
   public Object getattr(Object obj, String name, Object defaultValue, StarlarkThread thread)
@@ -663,7 +633,7 @@
       doc =
           "Returns a list of strings: the names of the attributes and "
               + "methods of the parameter object.",
-      parameters = {@Param(name = "x", doc = "The object to check.", noneable = true)},
+      parameters = {@Param(name = "x", doc = "The object to check.")},
       useStarlarkThread = true)
   public StarlarkList<?> dir(Object object, StarlarkThread thread) throws EvalException {
     return Starlark.dir(thread.mutability(), thread.getSemantics(), object);
@@ -677,15 +647,15 @@
       parameters = {
         @Param(
             name = "msg",
-            type = Object.class,
             doc = "Error to display for the user. The object is converted to a string.",
             defaultValue = "None",
-            named = true,
-            noneable = true),
+            named = true),
         @Param(
             name = "attr",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc =
                 "The name of the attribute that caused the error. This is used only for "
@@ -715,7 +685,6 @@
       parameters = {
         @Param(
             name = "sep",
-            type = String.class,
             defaultValue = "\" \"",
             named = true,
             positional = false,
@@ -757,7 +726,7 @@
               + "<pre class=\"language-python\">"
               + "if type(x) == type([]):  # if x is a list"
               + "</pre>",
-      parameters = {@Param(name = "x", doc = "The object to check type of.", noneable = true)})
+      parameters = {@Param(name = "x", doc = "The object to check type of.")})
   public String type(Object object) {
     // There is no 'type' type in Starlark, so we return a string with the type name.
     return Starlark.type(object);
diff --git a/src/main/java/net/starlark/java/eval/ParamDescriptor.java b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
index f62b221..be42efa 100644
--- a/src/main/java/net/starlark/java/eval/ParamDescriptor.java
+++ b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
@@ -79,16 +79,10 @@
       for (ParamType pt : allowedTypes) {
         allowedClasses.add(pt.type());
       }
-    } else if (param.type() == Void.class) {
-      // If no Param.type type was specified, use the class of the parameter itself.
+    } else {
+      // Use the class of the parameter itself.
       // Interpret primitive boolean parameter as j.l.Boolean.
       allowedClasses.add(paramClass == Boolean.TYPE ? Boolean.class : paramClass);
-    } else {
-      allowedClasses.add(param.type());
-    }
-
-    if (param.noneable() && !allowedClasses.contains(NoneType.class)) {
-      allowedClasses.add(NoneType.class);
     }
 
     return new ParamDescriptor(
diff --git a/src/main/java/net/starlark/java/eval/StarlarkList.java b/src/main/java/net/starlark/java/eval/StarlarkList.java
index c62ce38..c0503e1 100644
--- a/src/main/java/net/starlark/java/eval/StarlarkList.java
+++ b/src/main/java/net/starlark/java/eval/StarlarkList.java
@@ -21,6 +21,7 @@
 import java.util.Collection;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkBuiltin;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.syntax.Location;
@@ -346,7 +347,7 @@
       doc =
           "Removes the first item from the list whose value is x. "
               + "It is an error if there is no such item.",
-      parameters = {@Param(name = "x", type = Object.class, doc = "The object to remove.")})
+      parameters = {@Param(name = "x", doc = "The object to remove.")})
   public NoneType removeObject(Object x) throws EvalException {
     for (int i = 0; i < size; i++) {
       if (elems[i].equals(x)) {
@@ -373,9 +374,7 @@
   @StarlarkMethod(
       name = "append",
       doc = "Adds an item to the end of the list.",
-      parameters = {
-        @Param(name = "item", type = Object.class, doc = "Item to add at the end.", noneable = true)
-      })
+      parameters = {@Param(name = "item", doc = "Item to add at the end.")})
   @SuppressWarnings("unchecked")
   public NoneType append(Object item) throws EvalException {
     add((E) item, (Location) null); // unchecked
@@ -396,8 +395,8 @@
       name = "insert",
       doc = "Inserts an item at a given position.",
       parameters = {
-        @Param(name = "index", type = StarlarkInt.class, doc = "The index of the given position."),
-        @Param(name = "item", type = Object.class, doc = "The item.", noneable = true)
+        @Param(name = "index", doc = "The index of the given position."),
+        @Param(name = "item", doc = "The item.")
       })
   @SuppressWarnings("unchecked")
   public NoneType insert(StarlarkInt index, Object item) throws EvalException {
@@ -408,7 +407,7 @@
   @StarlarkMethod(
       name = "extend",
       doc = "Adds all items to the end of the list.",
-      parameters = {@Param(name = "items", type = Object.class, doc = "Items to add at the end.")})
+      parameters = {@Param(name = "items", doc = "Items to add at the end.")})
   public NoneType extend(Object items) throws EvalException {
     @SuppressWarnings("unchecked")
     Iterable<? extends E> src = (Iterable<? extends E>) Starlark.toIterable(items);
@@ -422,19 +421,23 @@
           "Returns the index in the list of the first item whose value is x. "
               + "It is an error if there is no such item.",
       parameters = {
-        @Param(name = "x", type = Object.class, doc = "The object to search."),
+        @Param(name = "x", doc = "The object to search."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class), // TODO(adonovan): this is wrong
+            },
             defaultValue = "None",
-            noneable = true, // TODO(adonovan): this is wrong
             named = true, // TODO(adonovan): this is wrong
             doc = "The start index of the list portion to inspect."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class), // TODO(adonovan): this is wrong
+            },
             defaultValue = "None",
-            noneable = true, // TODO(adonovan): this is wrong
             named = true, // TODO(adonovan): this is wrong
             doc = "The end index of the list portion to inspect.")
       })
@@ -458,8 +461,10 @@
       parameters = {
         @Param(
             name = "i",
-            type = StarlarkInt.class,
-            noneable = true, // TODO(adonovan): this is not what Python3 does
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class), // TODO(adonovan): this is not what Python3 does
+            },
             defaultValue = "-1",
             doc = "The index of the item.")
       })
diff --git a/src/main/java/net/starlark/java/eval/StringModule.java b/src/main/java/net/starlark/java/eval/StringModule.java
index 7375526..35230d5 100644
--- a/src/main/java/net/starlark/java/eval/StringModule.java
+++ b/src/main/java/net/starlark/java/eval/StringModule.java
@@ -121,10 +121,7 @@
               + "joined by this string as a separator. Example:<br>"
               + "<pre class=\"language-python\">\"|\".join([\"a\", \"b\", \"c\"]) == \"a|b|c\""
               + "</pre>",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "elements", type = Object.class, doc = "The objects to join.")
-      })
+      parameters = {@Param(name = "self"), @Param(name = "elements", doc = "The objects to join.")})
   public String join(String self, Object elements) throws EvalException {
     Iterable<?> items = Starlark.toIterable(elements);
     int i = 0;
@@ -141,7 +138,7 @@
   @StarlarkMethod(
       name = "lower",
       doc = "Returns the lower case version of this string.",
-      parameters = {@Param(name = "self", type = String.class)})
+      parameters = {@Param(name = "self")})
   public String lower(String self) {
     return Ascii.toLowerCase(self);
   }
@@ -149,7 +146,7 @@
   @StarlarkMethod(
       name = "upper",
       doc = "Returns the upper case version of this string.",
-      parameters = {@Param(name = "self", type = String.class)})
+      parameters = {@Param(name = "self")})
   public String upper(String self) {
     return Ascii.toUpperCase(self);
   }
@@ -200,11 +197,13 @@
               + "\"abcba\".lstrip(\"ba\") == \"cba\""
               + "</pre>",
       parameters = {
-        @Param(name = "self", type = String.class),
+        @Param(name = "self"),
         @Param(
             name = "chars",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             doc = "The characters to remove, or all whitespace if None.",
             defaultValue = "None")
       })
@@ -223,11 +222,13 @@
               + "\"abcbaa\".rstrip(\"ab\") == \"abc\""
               + "</pre>",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
         @Param(
             name = "chars",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             doc = "The characters to remove, or all whitespace if None.",
             defaultValue = "None")
       })
@@ -247,11 +248,13 @@
               + "\"aabcbcbaa\".strip(\"ab\") == \"cbc\""
               + "</pre>",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
         @Param(
             name = "chars",
-            type = String.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             doc = "The characters to remove, or all whitespace if None.",
             defaultValue = "None")
       })
@@ -267,13 +270,16 @@
               + "of <code>old</code> have been replaced with <code>new</code>, optionally "
               + "restricting the number of replacements to <code>maxsplit</code>.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "old", type = String.class, doc = "The string to be replaced."),
-        @Param(name = "new", type = String.class, doc = "The string to replace with."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "old", doc = "The string to be replaced."),
+        @Param(name = "new", doc = "The string to replace with."),
         @Param(
             name = "count",
-            type = StarlarkInt.class,
-            noneable = true, // TODO(#11244): Set false once incompatible flag is deleted.
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(
+                  type = NoneType.class), // TODO(#11244): remove once incompatible flag is deleted.
+            },
             defaultValue = "unbound",
             doc =
                 "The maximum number of replacements. If omitted, there is no limit."
@@ -339,12 +345,14 @@
           "Returns a list of all the words in the string, using <code>sep</code> as the "
               + "separator, optionally limiting the number of splits to <code>maxsplit</code>.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sep", type = String.class, doc = "The string to split on."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sep", doc = "The string to split on."),
         @Param(
             name = "maxsplit",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "The maximum number of splits.")
       },
@@ -379,12 +387,14 @@
               + "separator, optionally limiting the number of splits to <code>maxsplit</code>. "
               + "Except for splitting from the right, this method behaves like split().",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sep", type = String.class, doc = "The string to split on."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sep", doc = "The string to split on."),
         @Param(
             name = "maxsplit",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "The maximum number of splits.")
       },
@@ -420,10 +430,7 @@
               + " returns the resulting partition as a three-element tuple of the form (before,"
               + " separator, after). If the input string does not contain the separator, partition"
               + " returns (self, '', '').",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "sep", type = String.class, doc = "The string to split on.")
-      })
+      parameters = {@Param(name = "self"), @Param(name = "sep", doc = "The string to split on.")})
   public Tuple<String> partition(String self, String sep) throws EvalException {
     return partitionCommon(self, sep, /*first=*/ true);
   }
@@ -435,10 +442,7 @@
               + " returns the resulting partition as a three-element tuple of the form (before,"
               + " separator, after). If the input string does not contain the separator,"
               + " rpartition returns ('', '', self).",
-      parameters = {
-        @Param(name = "self", type = String.class),
-        @Param(name = "sep", type = String.class, doc = "The string to split on.")
-      })
+      parameters = {@Param(name = "self"), @Param(name = "sep", doc = "The string to split on.")})
   public Tuple<String> rpartition(String self, String sep) throws EvalException {
     return partitionCommon(self, sep, /*first=*/ false);
   }
@@ -478,7 +482,7 @@
       doc =
           "Returns a copy of the string with its first character (if any) capitalized and the rest "
               + "lowercased. This method does not support non-ascii characters. ",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public String capitalize(String self) throws EvalException {
     if (self.isEmpty()) {
       return self;
@@ -494,7 +498,7 @@
               + "uppercase letter while the remaining letters are lowercase. In this "
               + "context, a word means strictly a sequence of letters. This method does "
               + "not support supplementary Unicode characters.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public String title(String self) throws EvalException {
     char[] data = self.toCharArray();
     boolean previousWasLetter = false;
@@ -544,18 +548,22 @@
               + "optionally restricting to <code>[start:end]</code>, "
               + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sub", doc = "The substring to find."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Restrict to search from this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position before which to restrict to search.")
       })
@@ -570,18 +578,22 @@
               + "optionally restricting to <code>[start:end]</code>, "
               + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sub", doc = "The substring to find."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Restrict to search from this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position before which to restrict to search.")
       })
@@ -596,18 +608,22 @@
               + "index exists, optionally restricting to <code>[start:end]</code>, "
               + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sub", doc = "The substring to find."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Restrict to search from this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position before which to restrict to search.")
       })
@@ -626,18 +642,22 @@
               + " index exists, optionally restricting to <code>[start:end]</code>"
               + "<code>start</code> being inclusive and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to find."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sub", doc = "The substring to find."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Restrict to search from this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position before which to restrict to search.")
       })
@@ -655,10 +675,10 @@
           "Splits the string at line boundaries ('\\n', '\\r\\n', '\\r') "
               + "and returns the result as a list.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
         @Param(
+            // TODO(b/67740837): clarify whether this is named or positional.
             name = "keepends",
-            type = Boolean.class,
             defaultValue = "False",
             doc = "Whether the line breaks should be included in the resulting list.")
       })
@@ -688,7 +708,7 @@
       doc =
           "Returns True if all characters in the string are alphabetic ([a-zA-Z]) and there is "
               + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isAlpha(String self) throws EvalException {
     return matches(self, ALPHA, false);
   }
@@ -698,7 +718,7 @@
       doc =
           "Returns True if all characters in the string are alphanumeric ([a-zA-Z0-9]) and there "
               + "is at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isAlnum(String self) throws EvalException {
     return matches(self, ALNUM, false);
   }
@@ -708,7 +728,7 @@
       doc =
           "Returns True if all characters in the string are digits ([0-9]) and there is "
               + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isDigit(String self) throws EvalException {
     return matches(self, DIGIT, false);
   }
@@ -718,7 +738,7 @@
       doc =
           "Returns True if all characters are white space characters and the string "
               + "contains at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isSpace(String self) throws EvalException {
     return matches(self, SPACE, false);
   }
@@ -728,7 +748,7 @@
       doc =
           "Returns True if all cased characters in the string are lowercase and there is "
               + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isLower(String self) throws EvalException {
     // Python also accepts non-cased characters, so we cannot use LOWER.
     return matches(self, UPPER.negate(), true);
@@ -739,7 +759,7 @@
       doc =
           "Returns True if all cased characters in the string are uppercase and there is "
               + "at least one character.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isUpper(String self) throws EvalException {
     // Python also accepts non-cased characters, so we cannot use UPPER.
     return matches(self, LOWER.negate(), true);
@@ -752,7 +772,7 @@
               + "This means that every uppercase character must follow an uncased one (e.g. "
               + "whitespace) and every lowercase character must follow a cased one (e.g. "
               + "uppercase or lowercase).",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Boolean isTitle(String self) throws EvalException {
     if (self.isEmpty()) {
       return false;
@@ -819,18 +839,22 @@
               + "string, optionally restricting to <code>[start:end]</code>, <code>start</code> "
               + "being inclusive and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
-        @Param(name = "sub", type = String.class, doc = "The substring to count."),
+        @Param(name = "self", doc = "This string."),
+        @Param(name = "sub", doc = "The substring to count."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Restrict to search from this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position before which to restrict to search.")
       })
@@ -858,7 +882,7 @@
           "Returns an iterable value containing successive 1-element substrings of the string. "
               + "Equivalent to <code>[s[i] for i in range(len(s))]</code>, except that the "
               + "returned value might not be a list.",
-      parameters = {@Param(name = "self", type = String.class, doc = "This string.")})
+      parameters = {@Param(name = "self", doc = "This string.")})
   public Sequence<String> elems(String self) throws EvalException {
     ImmutableList.Builder<String> builder = new ImmutableList.Builder<>();
     for (char c : self.toCharArray()) {
@@ -874,7 +898,7 @@
               + "restricting to <code>[start:end]</code>, <code>start</code> being inclusive "
               + "and <code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
         @Param(
             name = "sub",
             allowedTypes = {
@@ -884,14 +908,18 @@
             doc = "The suffix (or tuple of alternative suffixes) to match."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Test beginning at this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "optional position at which to stop comparing.")
       })
@@ -935,20 +963,11 @@
               + "# Access by name:\n"
               + "\"x{key}x\".format(key = 2) == \"x2x\"</pre>\n",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
       },
-      extraPositionals =
-          @Param(
-              name = "args",
-              type = Tuple.class,
-              defaultValue = "()",
-              doc = "List of arguments."),
+      extraPositionals = @Param(name = "args", defaultValue = "()", doc = "List of arguments."),
       extraKeywords =
-          @Param(
-              name = "kwargs",
-              type = Dict.class,
-              defaultValue = "{}",
-              doc = "Dictionary of arguments."))
+          @Param(name = "kwargs", defaultValue = "{}", doc = "Dictionary of arguments."))
   public String format(String self, Tuple<Object> args, Dict<String, Object> kwargs)
       throws EvalException {
     return new FormatParser().format(self, args, kwargs);
@@ -961,7 +980,7 @@
               + "restricting to <code>[start:end]</code>, <code>start</code> being inclusive and "
               + "<code>end</code> being exclusive.",
       parameters = {
-        @Param(name = "self", type = String.class, doc = "This string."),
+        @Param(name = "self", doc = "This string."),
         @Param(
             name = "sub",
             allowedTypes = {
@@ -971,14 +990,18 @@
             doc = "The prefix (or tuple of alternative prefixes) to match."),
         @Param(
             name = "start",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "0",
             doc = "Test beginning at this position."),
         @Param(
             name = "end",
-            type = StarlarkInt.class,
-            noneable = true,
+            allowedTypes = {
+              @ParamType(type = StarlarkInt.class),
+              @ParamType(type = NoneType.class),
+            },
             defaultValue = "None",
             doc = "Stop comparing at this position.")
       })
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
index 45c3d2b..b8ae38a 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleClassFunctionsTest.java
@@ -214,7 +214,10 @@
   @Test
   public void testAttrAllowedFileTypesWrongType() throws Exception {
     ev.checkEvalErrorContains(
-        "allow_files should be a boolean or a string list", "attr.label_list(allow_files = 18)");
+        // TODO(adonovan): this seems like a UI regression.
+        // Was: allow_files should be a boolean or a string list
+        "got value of type 'int', want 'bool or sequence or NoneType'",
+        "attr.label_list(allow_files = 18)");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
index 5a192fe..01fdbfb 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
@@ -104,7 +104,7 @@
       documented = false,
       parameters = {
         @Param(name = "mandatory", doc = "", named = true),
-        @Param(name = "optional", doc = "", defaultValue = "None", noneable = true, named = true),
+        @Param(name = "optional", doc = "", defaultValue = "None", named = true),
         @Param(name = "mandatory_key", doc = "", positional = false, named = true),
         @Param(
             name = "optional_key",
diff --git a/src/test/java/net/starlark/java/annot/processor/StarlarkMethodProcessorTest.java b/src/test/java/net/starlark/java/annot/processor/StarlarkMethodProcessorTest.java
index 32c9925..90e1afe 100644
--- a/src/test/java/net/starlark/java/annot/processor/StarlarkMethodProcessorTest.java
+++ b/src/test/java/net/starlark/java/annot/processor/StarlarkMethodProcessorTest.java
@@ -162,27 +162,6 @@
   }
 
   @Test
-  public void testInvalidParamNoneDefault() throws Exception {
-    assertAbout(javaSource())
-        .that(getFile("InvalidParamNoneDefault.java"))
-        .processedWith(new StarlarkMethodProcessor())
-        .failsToCompile()
-        .withErrorContaining(
-            "Parameter 'a_parameter' has 'None' default value but is not noneable.");
-  }
-
-  @Test
-  public void testParamTypeConflict() throws Exception {
-    assertAbout(javaSource())
-        .that(getFile("ParamTypeConflict.java"))
-        .processedWith(new StarlarkMethodProcessor())
-        .failsToCompile()
-        .withErrorContaining(
-            "Parameter 'a_parameter' has both 'type' and 'allowedTypes' specified."
-                + " Only one may be specified.");
-  }
-
-  @Test
   public void testParamNeitherNamedNorPositional() throws Exception {
     assertAbout(javaSource())
         .that(getFile("ParamNeitherNamedNorPositional.java"))
@@ -344,15 +323,4 @@
             "parameter 'one' has generic type "
                 + "net.starlark.java.eval.Sequence<java.lang.String>");
   }
-
-  @Test
-  public void testInvalidNoneableParameter() throws Exception {
-    assertAbout(javaSource())
-        .that(getFile("InvalidNoneableParameter.java"))
-        .processedWith(new StarlarkMethodProcessor())
-        .failsToCompile()
-        .withErrorContaining(
-            "Expected type 'Object' but got type 'java.lang.String' "
-                + "for noneable parameter 'aParameter'.");
-  }
 }
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ArgumentMissing.java b/src/test/java/net/starlark/java/annot/processor/testsources/ArgumentMissing.java
index 622d0bf..4d3d224 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ArgumentMissing.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ArgumentMissing.java
@@ -28,7 +28,7 @@
       name = "method_with_params",
       documented = false,
       parameters = {
-        @Param(name = "a_parameter", type = String.class, named = true),
+        @Param(name = "a_parameter", named = true),
       })
   public String methodWithParams() {
     return "bunny";
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java b/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
index 7b0e11c..1976bdb 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ConflictingMethodNames.java
@@ -29,7 +29,7 @@
       name = "conflicting_method",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
+        @Param(name = "one", named = true),
       })
   public String conflictingMethod(String one) {
     return "foo";
@@ -39,8 +39,8 @@
       name = "conflicting_method",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       })
   public String conflictingMethodTwo(String one, StarlarkInt two) {
     return "foo";
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
index 01abb8c..7e1c3b3 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlag.java
@@ -29,8 +29,8 @@
       name = "someMethod",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       enableOnlyWithFlag = FOO,
       disableWithFlag = FOO)
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
index fd2c654..828b41c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/EnablingAndDisablingFlagParam.java
@@ -31,13 +31,8 @@
       name = "someMethod",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(
-            name = "two",
-            type = StarlarkInt.class,
-            named = true,
-            enableOnlyWithFlag = FOO,
-            disableWithFlag = FOO),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true, enableOnlyWithFlag = FOO, disableWithFlag = FOO),
       })
   public String someMethod(String one, StarlarkInt two) {
     return "foo";
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java b/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
index 33940c1..3aefe18 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/GoldenCase.java
@@ -15,8 +15,10 @@
 package net.starlark.java.annot.processor.testsources;
 
 import net.starlark.java.annot.Param;
+import net.starlark.java.annot.ParamType;
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
+import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkSemantics;
@@ -48,14 +50,16 @@
       name = "three_arg_method",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
         @Param(
             name = "three",
-            type = String.class,
+            allowedTypes = {
+              @ParamType(type = String.class),
+              @ParamType(type = NoneType.class),
+            },
             named = true,
-            defaultValue = "None",
-            noneable = true),
+            defaultValue = "None"),
       })
   public String threeArgMethod(String one, StarlarkInt two, Object three) {
     return "bar";
@@ -65,9 +69,9 @@
       name = "three_arg_method_with_params_and_thread",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
-        @Param(name = "three", type = String.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
+        @Param(name = "three", named = true),
       },
       useStarlarkThread = true)
   public String threeArgMethodWithParams(
@@ -79,22 +83,12 @@
       name = "many_arg_method_mixing_positional_and_named",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, positional = true, named = false),
-        @Param(name = "two", type = String.class, positional = true, named = true),
-        @Param(
-            name = "three",
-            type = String.class,
-            positional = true,
-            named = true,
-            defaultValue = "three"),
-        @Param(name = "four", type = String.class, positional = false, named = true),
-        @Param(
-            name = "five",
-            type = String.class,
-            positional = false,
-            named = true,
-            defaultValue = "five"),
-        @Param(name = "six", type = String.class, positional = false, named = true),
+        @Param(name = "one", positional = true, named = false),
+        @Param(name = "two", positional = true, named = true),
+        @Param(name = "three", positional = true, named = true, defaultValue = "three"),
+        @Param(name = "four", positional = false, named = true),
+        @Param(name = "five", positional = false, named = true, defaultValue = "five"),
+        @Param(name = "six", positional = false, named = true),
       })
   public String manyArgMethodMixingPositionalAndNamed(
       String one, String two, String three, String four, String five, String six) {
@@ -105,8 +99,8 @@
       name = "two_arg_method_with_params_and_thread_and_kwargs",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       extraKeywords = @Param(name = "kwargs"),
       useStarlarkThread = true)
@@ -119,8 +113,8 @@
       name = "two_arg_method_with_env_and_args_and_kwargs",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       extraPositionals = @Param(name = "args"),
       extraKeywords = @Param(name = "kwargs"),
@@ -134,8 +128,8 @@
       name = "selfCallMethod",
       selfCall = true,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       documented = false)
   public Integer selfCallMethod(String one, StarlarkInt two) {
@@ -155,8 +149,8 @@
       name = "method_with_list_and_dict",
       documented = false,
       parameters = {
-        @Param(name = "one", type = Sequence.class, named = true),
-        @Param(name = "two", type = Dict.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       })
   public String methodWithListandDict(Sequence<?> one, Dict<?, ?> two) {
     return "bar";
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/InvalidNoneableParameter.java b/src/test/java/net/starlark/java/annot/processor/testsources/InvalidNoneableParameter.java
deleted file mode 100644
index 418c10c..0000000
--- a/src/test/java/net/starlark/java/annot/processor/testsources/InvalidNoneableParameter.java
+++ /dev/null
@@ -1,37 +0,0 @@
-// 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 net.starlark.java.annot.processor.testsources;
-
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.StarlarkValue;
-
-/**
- * Test case for a StarlarkMethod method which has a parameter with both type and allowedTypes
- * specified.
- */
-public class InvalidNoneableParameter implements StarlarkValue {
-
-  @StarlarkMethod(
-      name = "invalid_noneable_parameter",
-      documented = false,
-      parameters = {
-        @Param(name = "a_parameter", type = String.class, noneable = true, named = true)
-      })
-  public Integer invalidNoneableParameter(String aParameter) {
-    return 42;
-  }
-
-}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/InvalidParamNoneDefault.java b/src/test/java/net/starlark/java/annot/processor/testsources/InvalidParamNoneDefault.java
deleted file mode 100644
index 5153113..0000000
--- a/src/test/java/net/starlark/java/annot/processor/testsources/InvalidParamNoneDefault.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 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 net.starlark.java.annot.processor.testsources;
-
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.StarlarkValue;
-
-/**
- * Test case for a StarlarkMethod method which has a parameter with "None" set as the default, but
- * noneable is not true.
- */
-public class InvalidParamNoneDefault implements StarlarkValue {
-
-  @StarlarkMethod(
-      name = "method_with_invalid_default",
-      documented = false,
-      parameters = {
-        @Param(name = "a_parameter", type = String.class, named = true, defaultValue = "None"),
-      })
-  public String methodWithParams(String x) {
-    return "lamb";
-  }
-}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java b/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
index 893056c..cdc28ba 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/MultipleSelfCallMethods.java
@@ -26,8 +26,8 @@
       name = "selfCallMethod",
       selfCall = true,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       documented = false)
   public StarlarkInt selfCallMethod(String one, StarlarkInt two) {
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ParamTypeConflict.java b/src/test/java/net/starlark/java/annot/processor/testsources/ParamTypeConflict.java
deleted file mode 100644
index 7fa25c7..0000000
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ParamTypeConflict.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2018 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 net.starlark.java.annot.processor.testsources;
-
-import net.starlark.java.annot.Param;
-import net.starlark.java.annot.ParamType;
-import net.starlark.java.annot.StarlarkMethod;
-import net.starlark.java.eval.StarlarkValue;
-
-/**
- * Test case for a StarlarkMethod method which has a parameter with both type and allowedTypes
- * specified.
- */
-public class ParamTypeConflict implements StarlarkValue {
-
-  @StarlarkMethod(
-      name = "param_type_conflict",
-      documented = false,
-      parameters = {
-        @Param(
-            name = "a_parameter",
-            type = String.class,
-            named = true,
-            allowedTypes = {
-              @ParamType(type = String.class),
-            })
-      })
-  public Integer paramTypeConflict(String x) {
-    return 42;
-  }
-}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/SpecifiedGenericType.java b/src/test/java/net/starlark/java/annot/processor/testsources/SpecifiedGenericType.java
index b25aa8f..286b60e 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/SpecifiedGenericType.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/SpecifiedGenericType.java
@@ -30,7 +30,7 @@
       name = "specified_generic_type",
       documented = false,
       parameters = {
-        @Param(name = "one", type = Sequence.class, named = true),
+        @Param(name = "one", named = true),
       })
   public String specifiedGenericType(Sequence<String> one) {
     return "bar";
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
index fb28b66..eee5838 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkInfoBeforeParams.java
@@ -29,9 +29,9 @@
       name = "skylark_info_wrong_order",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
-        @Param(name = "three", type = String.class, named = true)
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
+        @Param(name = "three", named = true)
       },
       useStarlarkThread = true)
   public String threeArgMethod(StarlarkThread thread, String one, StarlarkInt two, String three) {
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
index 6b1a1f1..b987277 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/StarlarkThreadMissing.java
@@ -29,8 +29,8 @@
       name = "three_arg_method_missing_env",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       useStarlarkThread = true)
   public String threeArgMethod(String one, StarlarkInt two, String shouldBeThread) {
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/StructFieldWithArguments.java b/src/test/java/net/starlark/java/annot/processor/testsources/StructFieldWithArguments.java
index 5b563f8..74d9444 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/StructFieldWithArguments.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/StructFieldWithArguments.java
@@ -24,7 +24,7 @@
   @StarlarkMethod(
       name = "struct_field_method",
       parameters = {
-        @Param(name = "foo", type = String.class, named = true),
+        @Param(name = "foo", named = true),
       },
       structField = true,
       doc = "A private method")
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
index 1f57f8d..c05f6de 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledKwargsParam.java
@@ -34,8 +34,8 @@
       name = "toggled_kwargs_method",
       documented = false,
       parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = StarlarkInt.class, named = true),
+        @Param(name = "one", named = true),
+        @Param(name = "two", named = true),
       },
       extraPositionals = @Param(name = "args"),
       extraKeywords = @Param(name = "kwargs", enableOnlyWithFlag = FOO),
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/TooManyArguments.java b/src/test/java/net/starlark/java/annot/processor/testsources/TooManyArguments.java
index 9021811..f79286e 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/TooManyArguments.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/TooManyArguments.java
@@ -28,7 +28,7 @@
       name = "method_with_too_many_arguments",
       documented = false,
       parameters = {
-        @Param(name = "parameter_one", type = String.class, named = true),
+        @Param(name = "parameter_one", named = true),
       })
   public String methodWithTooManyArguments(String parameterOne, String parameterTwo) {
     return "dolphin";
diff --git a/src/test/java/net/starlark/java/eval/Examples.java b/src/test/java/net/starlark/java/eval/Examples.java
index f098a29..00a5cac 100644
--- a/src/test/java/net/starlark/java/eval/Examples.java
+++ b/src/test/java/net/starlark/java/eval/Examples.java
@@ -123,10 +123,10 @@
   static final class MyFunctions {
     @StarlarkMethod(
         name = "square",
-        parameters = {@Param(name = "x", type = int.class)},
+        parameters = {@Param(name = "x")},
         doc = "Returns the square of its integer argument.")
-    public int square(int x) {
-      return x * x;
+    public StarlarkInt square(StarlarkInt x) {
+      return StarlarkInt.multiply(x, x);
     }
   }
 }
diff --git a/src/test/java/net/starlark/java/eval/ScriptTest.java b/src/test/java/net/starlark/java/eval/ScriptTest.java
index 0cce2e6..03584ae 100644
--- a/src/test/java/net/starlark/java/eval/ScriptTest.java
+++ b/src/test/java/net/starlark/java/eval/ScriptTest.java
@@ -62,7 +62,7 @@
       name = "assert_",
       documented = false,
       parameters = {
-        @Param(name = "cond", noneable = true),
+        @Param(name = "cond"),
         @Param(name = "msg", defaultValue = "'assertion failed'"),
       },
       useStarlarkThread = true)
@@ -78,12 +78,11 @@
       name = "assert_eq",
       documented = false,
       parameters = {
-        @Param(name = "x", noneable = true),
-        @Param(name = "y", noneable = true),
+        @Param(name = "x"),
+        @Param(name = "y"),
       },
       useStarlarkThread = true)
   public Object assertEq(Object x, Object y, StarlarkThread thread) throws EvalException {
-    // TODO(adonovan): use Starlark.equals.
     if (!x.equals(y)) {
       String msg = String.format("assert_eq: %s != %s", Starlark.repr(x), Starlark.repr(y));
       thread.getThreadLocal(Reporter.class).reportError(thread, msg);
diff --git a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
index b5f5ccf..59d39f7 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
@@ -122,7 +122,7 @@
         selfCall = true,
         documented = false,
         parameters = {
-          @Param(name = "pos", positional = true, type = String.class),
+          @Param(name = "pos", positional = true),
         })
     public String selfCall(String myName) {
       return "I'm a mock named " + myName;
@@ -130,7 +130,7 @@
 
     @StarlarkMethod(
         name = "value_of",
-        parameters = {@Param(name = "str", type = String.class)},
+        parameters = {@Param(name = "str")},
         documented = false)
     public Integer valueOf(String str) {
       return Integer.valueOf(str);
@@ -138,7 +138,7 @@
 
     @StarlarkMethod(
         name = "is_empty",
-        parameters = {@Param(name = "str", type = String.class)},
+        parameters = {@Param(name = "str")},
         documented = false)
     public Boolean isEmpty(String str) {
       return str.isEmpty();
@@ -185,8 +185,8 @@
     @StarlarkMethod(
         name = "nullfunc_failing",
         parameters = {
-          @Param(name = "p1", type = String.class),
-          @Param(name = "p2", type = StarlarkInt.class),
+          @Param(name = "p1"),
+          @Param(name = "p2"),
         },
         documented = false,
         allowReturnNones = false)
@@ -222,31 +222,18 @@
         documented = false,
         parameters = {
           @Param(name = "pos1"),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(
-              name = "posOrNamed",
-              defaultValue = "False",
-              type = Boolean.class,
-              positional = true,
-              named = true),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-          @Param(
-              name = "optionalNamed",
-              type = Boolean.class,
-              defaultValue = "False",
-              positional = false,
-              named = true),
-          @Param(
-              name = "acceptsAny",
-              type = Object.class,
-              defaultValue = "\"a\"",
-              positional = false,
-              named = true),
+          @Param(name = "pos2", defaultValue = "False"),
+          @Param(name = "posOrNamed", defaultValue = "False", positional = true, named = true),
+          @Param(name = "named", positional = false, named = true),
+          @Param(name = "optionalNamed", defaultValue = "False", positional = false, named = true),
+          @Param(name = "acceptsAny", defaultValue = "'a'", positional = false, named = true),
           @Param(
               name = "noneable",
-              type = StarlarkInt.class,
+              allowedTypes = {
+                @ParamType(type = StarlarkInt.class),
+                @ParamType(type = NoneType.class),
+              },
               defaultValue = "None",
-              noneable = true,
               positional = false,
               named = true),
           @Param(
@@ -255,9 +242,9 @@
                 @ParamType(type = String.class),
                 @ParamType(type = StarlarkInt.class),
                 @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
+                @ParamType(type = NoneType.class),
               },
               defaultValue = "None",
-              noneable = true,
               positional = false,
               named = true)
         })
@@ -297,31 +284,18 @@
         documented = false,
         parameters = {
           @Param(name = "pos1"),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(
-              name = "posOrNamed",
-              defaultValue = "False",
-              type = Boolean.class,
-              positional = true,
-              named = true),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
-          @Param(
-              name = "optionalNamed",
-              type = Boolean.class,
-              defaultValue = "False",
-              positional = false,
-              named = true),
-          @Param(
-              name = "acceptsAny",
-              type = Object.class,
-              defaultValue = "\"a\"",
-              positional = false,
-              named = true),
+          @Param(name = "pos2", defaultValue = "False"),
+          @Param(name = "posOrNamed", defaultValue = "False", positional = true, named = true),
+          @Param(name = "named", positional = false, named = true),
+          @Param(name = "optionalNamed", defaultValue = "False", positional = false, named = true),
+          @Param(name = "acceptsAny", defaultValue = "'a'", positional = false, named = true),
           @Param(
               name = "noneable",
-              type = StarlarkInt.class,
+              allowedTypes = {
+                @ParamType(type = StarlarkInt.class),
+                @ParamType(type = NoneType.class),
+              },
               defaultValue = "None",
-              noneable = true,
               positional = false,
               named = true),
           @Param(
@@ -330,9 +304,9 @@
                 @ParamType(type = String.class),
                 @ParamType(type = StarlarkInt.class),
                 @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
+                @ParamType(type = NoneType.class),
               },
               defaultValue = "None",
-              noneable = true,
               positional = false,
               named = true)
         },
@@ -388,9 +362,9 @@
         name = "with_args_and_thread",
         documented = false,
         parameters = {
-          @Param(name = "pos1", type = StarlarkInt.class),
-          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
+          @Param(name = "pos1"),
+          @Param(name = "pos2", defaultValue = "False"),
+          @Param(name = "named", positional = false, named = true),
         },
         extraPositionals = @Param(name = "args"),
         useStarlarkThread = true)
@@ -412,8 +386,8 @@
         name = "with_kwargs",
         documented = false,
         parameters = {
-          @Param(name = "pos", defaultValue = "False", type = Boolean.class),
-          @Param(name = "named", type = Boolean.class, positional = false, named = true),
+          @Param(name = "pos", defaultValue = "False"),
+          @Param(name = "named", positional = false, named = true),
         },
         extraKeywords = @Param(name = "kwargs"))
     public String withKwargs(boolean pos, boolean named, Dict<String, Object> kwargs) {
@@ -432,7 +406,7 @@
         name = "with_args_and_kwargs",
         documented = false,
         parameters = {
-          @Param(name = "foo", named = true, positional = true, type = String.class),
+          @Param(name = "foo", named = true, positional = true),
         },
         extraPositionals = @Param(name = "args"),
         extraKeywords = @Param(name = "kwargs"))
@@ -475,7 +449,7 @@
   static interface MockInterface extends StarlarkValue {
     @StarlarkMethod(
         name = "is_empty_interface",
-        parameters = {@Param(name = "str", type = String.class)},
+        parameters = {@Param(name = "str")},
         documented = false)
     public Boolean isEmptyInterface(String str);
   }
@@ -498,7 +472,7 @@
         name = "method",
         documented = false,
         parameters = {
-          @Param(name = "foo", named = true, positional = true, type = Object.class),
+          @Param(name = "foo", named = true, positional = true),
         })
     public ObjectT method(ObjectT o);
   }
diff --git a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
index 3e4c4bd..7747422 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
@@ -54,15 +54,14 @@
         name = "positionals_only_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
+          @Param(name = "a", positional = true, named = false),
           @Param(
               name = "b",
               positional = true,
               named = false,
-              type = Boolean.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "False"),
-          @Param(name = "c", positional = true, named = false, type = StarlarkInt.class),
+          @Param(name = "c", positional = true, named = false),
         },
         useStarlarkThread = true)
     public String positionalsOnlyMethod(
@@ -74,15 +73,14 @@
         name = "keywords_only_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
+          @Param(name = "a", positional = false, named = true),
           @Param(
               name = "b",
               positional = false,
               named = true,
-              type = Boolean.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "False"),
-          @Param(name = "c", positional = false, named = true, type = StarlarkInt.class),
+          @Param(name = "c", positional = false, named = true),
         },
         useStarlarkThread = true)
     public String keywordsOnlyMethod(
@@ -94,22 +92,20 @@
         name = "mixed_params_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
+          @Param(name = "a", positional = true, named = false),
           @Param(
               name = "b",
               positional = true,
               named = false,
-              type = Boolean.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "False"),
           @Param(
               name = "c",
               positional = false,
               named = true,
-              type = StarlarkInt.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "3"),
-          @Param(name = "d", positional = false, named = true, type = Boolean.class),
+          @Param(name = "d", positional = false, named = true),
         },
         useStarlarkThread = true)
     public String mixedParamsMethod(
@@ -121,19 +117,17 @@
         name = "keywords_multiple_flags",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
+          @Param(name = "a", positional = false, named = true),
           @Param(
               name = "b",
               positional = false,
               named = true,
-              type = Boolean.class,
               disableWithFlag = FLAG2,
               valueWhenDisabled = "False"),
           @Param(
               name = "c",
               positional = false,
               named = true,
-              type = StarlarkInt.class,
               enableOnlyWithFlag = FLAG1,
               valueWhenDisabled = "3"),
         },
diff --git a/src/test/java/net/starlark/java/eval/testdata/int_constructor.sky b/src/test/java/net/starlark/java/eval/testdata/int_constructor.sky
index 2ca2584..fd64fc6 100644
--- a/src/test/java/net/starlark/java/eval/testdata/int_constructor.sky
+++ b/src/test/java/net/starlark/java/eval/testdata/int_constructor.sky
@@ -78,7 +78,7 @@
 ---
 int('123', 37) ### invalid base 37 \(want 2 <= base <= 36\)
 ---
-int('123', 'x') ### parameter 'base' got value of type 'string', want 'int'
+int('123', 'x') ### got string for base, want int
 ---
 int(True, 2) ### can't convert non-string with explicit base
 ---