BEGIN_PUBLIC
starlark: abolish 'int reboxing' hack

...in which a StarlarkMethod-annotated Java function could declare
a parameter of type Integer to mean "StarlarkInt in the signed 32-bit range".
The feature was useful in transition but does not carry its weight.

END_PUBLIC

PiperOrigin-RevId: 336087480
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
index d2f06af..cbe91ba 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContext.java
@@ -89,6 +89,7 @@
 import net.starlark.java.eval.Mutability;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkSemantics;
 import net.starlark.java.eval.StarlarkThread;
 
@@ -535,13 +536,14 @@
   @Override
   public StarlarkExecutionResult execute(
       Sequence<?> arguments, // <String> or <StarlarkPath> or <Label> expected
-      Integer timeout,
+      StarlarkInt timeoutI,
       Dict<?, ?> uncheckedEnvironment, // <String, String> expected
       boolean quiet,
       String workingDirectory,
       StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
     validateExecuteArguments(arguments);
+    int timeout = Starlark.toInt(timeoutI, "timeout");
 
     Map<String, String> environment =
         Dict.cast(uncheckedEnvironment, String.class, String.class, "environment");
@@ -575,7 +577,7 @@
     env.getListener().post(w);
     createDirectory(outputDirectory);
 
-    long timeoutMillis = Math.round(timeout.longValue() * 1000 * timeoutScaling);
+    long timeoutMillis = Math.round(timeout * 1000L * timeoutScaling);
     if (processWrapper != null) {
       args =
           processWrapper
@@ -622,8 +624,9 @@
   }
 
   @Override
-  public void patch(Object patchFile, Integer strip, StarlarkThread thread)
+  public void patch(Object patchFile, StarlarkInt stripI, StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
+    int strip = Starlark.toInt(stripI, "strip");
     StarlarkPath starlarkPath = getPath("patch()", patchFile);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newPatchEvent(
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 7068ddf..355ee22 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.starlarkbuildapi.cpp.BazelCcModuleApi;
 import net.starlark.java.eval.EvalException;
 import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.Tuple;
@@ -129,7 +130,7 @@
       String language,
       String outputType,
       boolean linkDepsStatically,
-      int stamp,
+      StarlarkInt stamp,
       Sequence<?> additionalInputs, // <Artifact> expected
       Object grepIncludes,
       StarlarkThread thread)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
index 2bb40a0..91feef8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkNativeModule.java
@@ -79,7 +79,7 @@
   public Sequence<?> glob(
       Sequence<?> include,
       Sequence<?> exclude,
-      Integer excludeDirs,
+      StarlarkInt excludeDirs,
       Object allowEmptyArgument,
       StarlarkThread thread)
       throws EvalException, ConversionException, InterruptedException {
@@ -103,7 +103,7 @@
 
     try {
       Globber.Token globToken =
-          context.globber.runAsync(includes, excludes, excludeDirs != 0, allowEmpty);
+          context.globber.runAsync(includes, excludes, excludeDirs.signum() != 0, allowEmpty);
       matches = context.globber.fetchUnsorted(globToken);
     } catch (IOException e) {
       String errorMessage =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index a80ff57..f747701 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -78,6 +78,7 @@
 import net.starlark.java.eval.NoneType;
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.Tuple;
@@ -1863,7 +1864,7 @@
       String language,
       String outputType,
       boolean linkDepsStatically,
-      int stamp,
+      StarlarkInt stamp,
       Sequence<?> additionalInputs,
       Object grepIncludes,
       StarlarkThread thread)
@@ -1871,7 +1872,7 @@
     validateLanguage(language);
     validateOutputType(outputType);
     boolean isStampingEnabled =
-        isStampingEnabled(stamp, actions.getRuleContext().getConfiguration());
+        isStampingEnabled(stamp.toInt("stamp"), actions.getRuleContext().getConfiguration());
     CcToolchainProvider ccToolchainProvider =
         convertFromNoneable(starlarkCcToolchainProvider, null);
     FeatureConfigurationForStarlark featureConfiguration =
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 55a56aa..c242578 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
@@ -22,6 +22,7 @@
 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;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -67,7 +68,6 @@
         // TODO(bazel-team): accept booleans as well as integers? (and eventually migrate?)
         @Param(
             name = "exclude_directories",
-            type = Integer.class,
             defaultValue = "1", // keep consistent with glob prefetching logic in PackageFactory
             named = true,
             doc = "A flag whether to exclude directories or not."),
@@ -86,7 +86,7 @@
   Sequence<?> glob(
       Sequence<?> include,
       Sequence<?> exclude,
-      Integer excludeDirectories,
+      StarlarkInt excludeDirectories,
       Object allowEmpty,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
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 bf16581..cab2f1d 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
@@ -26,6 +26,7 @@
 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;
 import net.starlark.java.eval.Tuple;
 
@@ -355,7 +356,7 @@
             positional = false,
             named = true,
             defaultValue = "0",
-            type = Integer.class),
+            type = StarlarkInt.class),
         @Param(
             name = "additional_inputs",
             doc = "For additional inputs to the linking action, e.g.: linking scripts.",
@@ -382,7 +383,7 @@
       String language,
       String outputType,
       boolean linkDepsStatically,
-      int stamp,
+      StarlarkInt stamp,
       Sequence<?> additionalInputs, // <FileT> expected
       Object grepIncludes,
       StarlarkThread thread)
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 ae0e2c0..109f2ca 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
@@ -24,6 +24,7 @@
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
 import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -236,7 +237,6 @@
                     + "execute."),
         @Param(
             name = "timeout",
-            type = Integer.class,
             named = true,
             defaultValue = "600",
             doc = "maximum duration of the command in seconds (default is 600 seconds)."),
@@ -263,7 +263,7 @@
       })
   StarlarkExecutionResultApi execute(
       Sequence<?> arguments,
-      Integer timeout,
+      StarlarkInt timeout,
       Dict<?, ?> environment, // <String, String> expected
       boolean quiet,
       String workingDirectory,
@@ -313,12 +313,11 @@
                     + "If it's a relative path, it will resolve to the repository directory."),
         @Param(
             name = "strip",
-            type = Integer.class,
             named = true,
             defaultValue = "0",
             doc = "strip the specified number of leading components from file names."),
       })
-  void patch(Object patchFile, Integer strip, StarlarkThread thread)
+  void patch(Object patchFile, StarlarkInt strip, StarlarkThread thread)
       throws EvalException, RepositoryFunctionExceptionT, InterruptedException;
 
   @StarlarkMethod(
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
index 1b1fd00..dbe5b38 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStarlarkNativeModuleApi.java
@@ -26,6 +26,7 @@
 import net.starlark.java.eval.Sequence;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkCallable;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.syntax.Location;
@@ -37,7 +38,7 @@
   public Sequence<?> glob(
       Sequence<?> include,
       Sequence<?> exclude,
-      Integer excludeDirectories,
+      StarlarkInt excludeDirectories,
       Object allowEmpty,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index b21c1c5..5c126ff 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -37,6 +37,7 @@
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.EvalException;
 import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.Tuple;
@@ -290,7 +291,7 @@
       String language,
       String outputType,
       boolean linkDepsStatically,
-      int stamp,
+      StarlarkInt stamp,
       Sequence<?> additionalInputs,
       Object grepIncludes,
       StarlarkThread thread)
diff --git a/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java b/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
index 352f66d..832cc71 100644
--- a/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
+++ b/src/main/java/net/starlark/java/annot/StarlarkInterfaceUtils.java
@@ -24,8 +24,7 @@
 
   /**
    * Returns the more specific class of two classes. Class x is more specific than class y if x is
-   * assignable to y. For example, of Integer.class and Object.class, Integer.class is more
-   * specific.
+   * assignable to y. For example, of String.class and Object.class, String.class is more specific.
    *
    * <p>If either class is null, returns the other class.
    *
diff --git a/src/main/java/net/starlark/java/annot/StarlarkMethod.java b/src/main/java/net/starlark/java/annot/StarlarkMethod.java
index c1f7a40..ac89d58 100644
--- a/src/main/java/net/starlark/java/annot/StarlarkMethod.java
+++ b/src/main/java/net/starlark/java/annot/StarlarkMethod.java
@@ -63,15 +63,6 @@
  *   <li>Noneable parameter variables must be declared with type Object, as the actual value may be
  *       either {@code None} or some other value, which do not share a superclass other than Object
  *       (or StarlarkValue, which is typically no more descriptive than Object).
- *   <li>A parameter may have type Integer, or have a {@link Param#type} or {@link
- *       Param#allowedTypes} annotation that includes Integer.class, even though Integer is not a
- *       legal Starlark value type. When called from Starlark code, such a parameter accepts
- *       StarlarkInt values, but only in the signed 32-bit value range. These values are "reboxed"
- *       to Integer. Note that reboxing will still occur in the case where the annotation-declared
- *       types include Integer.class but the parameter's type is Object. This means the parameter's
- *       value cannot be assumed to be a legal Starlark value and should not be freely passed to
- *       other functions in the Starlark API that require a legal value. To avoid the range and
- *       legality limitations of reboxing, simply use StarlarkInt in place of Integer.
  *   <li>Parameter variables whose class is generic must be declared using wildcard types. For
  *       example, {@code Sequence<?>} is allowed but {@code Sequence<String>} is forbidden. This is
  *       because the call-time dynamic checks verify the class but cannot verify the type
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 71b3767..9103eb0 100644
--- a/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
+++ b/src/main/java/net/starlark/java/annot/processor/StarlarkMethodProcessor.java
@@ -329,6 +329,15 @@
           paramAnnot.name());
     }
 
+    // Give helpful hint for parameter of type Integer.
+    TypeMirror integerType = getType("java.lang.Integer");
+    if (types.isSameType(paramType, integerType)) {
+      errorf(
+          param,
+          "use StarlarkInt, not Integer for parameter '%s' (and see Starlark.toInt)",
+          paramAnnot.name());
+    }
+
     // Check param.type.
     if (!types.isSameType(getParamType(paramAnnot), voidType)) {
       // Reject Param.type if not assignable to parameter variable.
diff --git a/src/main/java/net/starlark/java/eval/BuiltinCallable.java b/src/main/java/net/starlark/java/eval/BuiltinCallable.java
index 8410c8e..a3f1342 100644
--- a/src/main/java/net/starlark/java/eval/BuiltinCallable.java
+++ b/src/main/java/net/starlark/java/eval/BuiltinCallable.java
@@ -185,7 +185,6 @@
       }
 
       Object value = positional[argIndex++];
-      value = param.reboxIntMaybe(value);
       checkParamValue(param, value);
       vector[paramIndex] = value;
     }
@@ -268,7 +267,6 @@
         continue;
       }
 
-      value = param.reboxIntMaybe(value);
       checkParamValue(param, value);
 
       // duplicate?
diff --git a/src/main/java/net/starlark/java/eval/MethodLibrary.java b/src/main/java/net/starlark/java/eval/MethodLibrary.java
index 65ff604..a908636 100644
--- a/src/main/java/net/starlark/java/eval/MethodLibrary.java
+++ b/src/main/java/net/starlark/java/eval/MethodLibrary.java
@@ -382,7 +382,7 @@
         @Param(name = "x", type = Object.class, doc = "The string to convert."),
         @Param(
             name = "base",
-            type = Integer.class,
+            type = StarlarkInt.class,
             defaultValue = "unbound",
             doc =
                 "The base used to interpret a string value; defaults to 10. Must be between 2 "
@@ -391,29 +391,25 @@
                     + "string.",
             named = true)
       })
-  public StarlarkInt intForStarlark(Object x, Object base) throws EvalException {
+  public StarlarkInt intForStarlark(Object x, Object baseO) throws EvalException {
     if (x instanceof String) {
-      if (base == Starlark.UNBOUND) {
-        base = 10;
-      } else if (!(base instanceof Integer)) {
-        throw Starlark.errorf("got %s for base, want int", Starlark.type(base));
-      }
+      int base = baseO == Starlark.UNBOUND ? 10 : Starlark.toInt(baseO, "base");
       try {
-        return StarlarkInt.parse((String) x, (Integer) base);
+        return StarlarkInt.parse((String) x, base);
       } catch (NumberFormatException ex) {
         throw Starlark.errorf("%s", ex.getMessage());
       }
-    } else {
-      if (base != Starlark.UNBOUND) {
-        throw Starlark.errorf("can't convert non-string with explicit base");
-      }
-      if (x instanceof Boolean) {
-        return StarlarkInt.of(((Boolean) x).booleanValue() ? 1 : 0);
-      } else if (x instanceof StarlarkInt) {
-        return (StarlarkInt) x;
-      }
-      throw Starlark.errorf("got %s, want string, int, or bool", Starlark.type(x));
     }
+
+    if (baseO != Starlark.UNBOUND) {
+      throw Starlark.errorf("can't convert non-string with explicit base");
+    }
+    if (x instanceof Boolean) {
+      return StarlarkInt.of(((Boolean) x).booleanValue() ? 1 : 0);
+    } else if (x instanceof StarlarkInt) {
+      return (StarlarkInt) x;
+    }
+    throw Starlark.errorf("got %s, want string, int, or bool", Starlark.type(x));
   }
 
   // TODO(adonovan): move into StarlarkInt.parse in a follow-up.
@@ -534,14 +530,15 @@
         @Param(name = "list", type = Object.class, doc = "input sequence.", named = true),
         @Param(
             name = "start",
-            type = Integer.class,
+            type = StarlarkInt.class,
             doc = "start index.",
             defaultValue = "0",
             named = true)
       },
       useStarlarkThread = true)
-  public StarlarkList<?> enumerate(Object input, Integer start, StarlarkThread thread)
+  public StarlarkList<?> enumerate(Object input, StarlarkInt startI, StarlarkThread thread)
       throws EvalException {
+    int start = Starlark.toInt(startI, "start");
     Object[] array = Starlark.toArray(input);
     for (int i = 0; i < array.length; i++) {
       array[i] = Tuple.pair(StarlarkInt.of(i + start), array[i]); // update in place
@@ -576,13 +573,13 @@
       parameters = {
         @Param(
             name = "start_or_stop",
-            type = Integer.class,
+            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 = Integer.class,
+            type = StarlarkInt.class,
             noneable = true,
             defaultValue = "None",
             doc =
@@ -590,28 +587,28 @@
                     + "list; generation of the list stops before <code>stop</code> is reached."),
         @Param(
             name = "step",
-            type = Integer.class,
+            type = StarlarkInt.class,
             defaultValue = "1",
             doc = "The increment (default is 1). It may be negative.")
       },
       useStarlarkThread = true)
   public Sequence<StarlarkInt> range(
-      Integer startOrStop, Object stopOrNone, Integer step, StarlarkThread thread)
+      StarlarkInt startOrStop, Object stopOrNone, StarlarkInt stepI, StarlarkThread thread)
       throws EvalException {
     int start;
     int stop;
     if (stopOrNone == Starlark.NONE) {
       start = 0;
-      stop = startOrStop;
-    } else if (stopOrNone instanceof Integer) {
-      start = startOrStop;
-      stop = (Integer) stopOrNone;
+      stop = startOrStop.toInt("stop");
     } else {
-      throw Starlark.errorf("want int, got %s", Starlark.type(stopOrNone));
+      start = startOrStop.toInt("start");
+      stop = Starlark.toInt(stopOrNone, "stop");
     }
+    int step = stepI.toInt("step");
     if (step == 0) {
       throw Starlark.errorf("step cannot be 0");
     }
+    // TODO(adonovan): support arbitrary integers.
     return new RangeList(start, stop, step);
   }
 
diff --git a/src/main/java/net/starlark/java/eval/ParamDescriptor.java b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
index 8edc2d5..811e505 100644
--- a/src/main/java/net/starlark/java/eval/ParamDescriptor.java
+++ b/src/main/java/net/starlark/java/eval/ParamDescriptor.java
@@ -30,7 +30,6 @@
 final class ParamDescriptor {
 
   private final String name;
-  private final boolean reboxInt; // whether StarlarkInt is converted to Integer
   @Nullable private final Object defaultValue;
   private final boolean noneable;
   private final boolean named;
@@ -47,16 +46,9 @@
       boolean named,
       boolean positional,
       List<Class<?>> allowedClasses,
-      boolean reboxInt,
       @Nullable String disabledByFlag) {
     this.name = name;
-    this.reboxInt = reboxInt;
-    try {
-      this.defaultValue =
-          defaultExpr.isEmpty() ? null : reboxIntMaybe(evalDefault(name, defaultExpr));
-    } catch (EvalException ex) {
-      throw new IllegalStateException(ex); // bad default
-    }
+    this.defaultValue = defaultExpr.isEmpty() ? null : evalDefault(name, defaultExpr);
     this.noneable = noneable;
     this.named = named;
     this.positional = positional;
@@ -65,17 +57,6 @@
   }
 
   /**
-   * Converts (if necessary for this parameter) a StarlarkInt argument to an Integer parameter,
-   * applying a range check.
-   */
-  Object reboxIntMaybe(Object value) throws EvalException {
-    if (reboxInt && value instanceof StarlarkInt) {
-      return ((StarlarkInt) value).toInt(getName()); // may fail
-    }
-    return value;
-  }
-
-  /**
    * Returns a {@link ParamDescriptor} representing the given raw {@link Param} annotation and the
    * given semantics.
    */
@@ -92,22 +73,12 @@
       Preconditions.checkState(!disabledByFlag.isEmpty());
     }
 
-    // A parameter of type Integer may accept an argument of type StarlarkInt,
-    // in which case BuiltinCallable.fastcall will apply this range check
-    // and convert (rebox) the argument.
-    // We also do this conversion for a parameter type of (say) Object
-    // if the allowedClasses include Integer.
-    boolean reboxInt = paramClass == Integer.class;
-
     // Compute set of allowed classes.
     ParamType[] allowedTypes = param.allowedTypes();
     List<Class<?>> allowedClasses = new ArrayList<>();
     if (allowedTypes.length > 0) {
       for (ParamType pt : allowedTypes) {
         allowedClasses.add(pt.type());
-        if (pt.type() == Integer.class) {
-          reboxInt = true;
-        }
       }
     } else if (param.type() == Void.class) {
       // If no Param.type type was specified, use the class of the parameter itself.
@@ -116,9 +87,6 @@
     } else {
       allowedClasses.add(param.type());
     }
-    if (param.type() == Integer.class) {
-      reboxInt = true;
-    }
     if (param.noneable()) {
       // A few annotations redundantly declare NoneType.
       if (!allowedClasses.contains(NoneType.class)) {
@@ -133,7 +101,6 @@
         param.named(),
         param.positional(),
         allowedClasses,
-        reboxInt,
         disabledByFlag);
   }
 
diff --git a/src/main/java/net/starlark/java/eval/Starlark.java b/src/main/java/net/starlark/java/eval/Starlark.java
index 68517d4..1690f77 100644
--- a/src/main/java/net/starlark/java/eval/Starlark.java
+++ b/src/main/java/net/starlark/java/eval/Starlark.java
@@ -270,12 +270,6 @@
       return "string";
     } else if (StarlarkInt.class.isAssignableFrom(c)) {
       return "int";
-    } else if (c.equals(Integer.class)) {
-      // Integer is not a legal Starlark value, but it is used for parameter types
-      // in built-in functions; StarlarkBuiltin.fastcall does a range check
-      // and reboxing. Use of this type means "signed 32-bit int value",
-      // but that's a lot for an error message.
-      return "int";
     } else if (c.equals(Boolean.class)) {
       return "bool";
     }
@@ -325,6 +319,11 @@
       // Any class of java.util.Map that isn't a Dict.
       return "Map";
 
+    } else if (c.equals(Integer.class)) {
+      // Integer is not a legal Starlark value, but it does appear as
+      // the return type for many built-in functions.
+      return "int";
+
     } else {
       String simpleName = c.getSimpleName();
       return simpleName.isEmpty() ? c.getName() : simpleName;
diff --git a/src/main/java/net/starlark/java/eval/StarlarkList.java b/src/main/java/net/starlark/java/eval/StarlarkList.java
index e658dae..4fa3b88 100644
--- a/src/main/java/net/starlark/java/eval/StarlarkList.java
+++ b/src/main/java/net/starlark/java/eval/StarlarkList.java
@@ -395,12 +395,12 @@
       name = "insert",
       doc = "Inserts an item at a given position.",
       parameters = {
-        @Param(name = "index", type = Integer.class, doc = "The index of the given position."),
+        @Param(name = "index", type = StarlarkInt.class, doc = "The index of the given position."),
         @Param(name = "item", type = Object.class, doc = "The item.", noneable = true)
       })
   @SuppressWarnings("unchecked")
-  public NoneType insert(Integer index, Object item) throws EvalException {
-    add(EvalUtils.toIndex(index, size), (E) item, (Location) null); // unchecked
+  public NoneType insert(StarlarkInt index, Object item) throws EvalException {
+    add(EvalUtils.toIndex(index.toInt("index"), size), (E) item, (Location) null); // unchecked
     return Starlark.NONE;
   }
 
@@ -424,22 +424,22 @@
         @Param(name = "x", type = Object.class, doc = "The object to search."),
         @Param(
             name = "start",
-            type = Integer.class,
+            type = StarlarkInt.class,
             defaultValue = "None",
             noneable = true, // TODO(adonovan): this is wrong
-            named = true,
+            named = true, // TODO(adonovan): this is wrong
             doc = "The start index of the list portion to inspect."),
         @Param(
             name = "end",
-            type = Integer.class,
+            type = StarlarkInt.class,
             defaultValue = "None",
             noneable = true, // TODO(adonovan): this is wrong
-            named = true,
+            named = true, // TODO(adonovan): this is wrong
             doc = "The end index of the list portion to inspect.")
       })
   public Integer index(Object x, Object start, Object end) throws EvalException {
-    int i = start == Starlark.NONE ? 0 : EvalUtils.toIndex((Integer) start, size);
-    int j = end == Starlark.NONE ? size : EvalUtils.toIndex((Integer) end, size);
+    int i = start == Starlark.NONE ? 0 : EvalUtils.toIndex(Starlark.toInt(start, "start"), size);
+    int j = end == Starlark.NONE ? size : EvalUtils.toIndex(Starlark.toInt(end, "end"), size);
     for (; i < j; i++) {
       if (elems[i].equals(x)) {
         return i;
@@ -457,13 +457,13 @@
       parameters = {
         @Param(
             name = "i",
-            type = Integer.class,
-            noneable = true, // TODO(adonovan): this is wrong
+            type = StarlarkInt.class,
+            noneable = true, // TODO(adonovan): this is not what Python3 does
             defaultValue = "-1",
             doc = "The index of the item.")
       })
   public Object pop(Object i) throws EvalException {
-    int arg = i == Starlark.NONE ? -1 : (Integer) i;
+    int arg = i == Starlark.NONE ? -1 : Starlark.toInt(i, "i");
     int index = EvalUtils.getSequenceIndex(arg, size);
     Object result = elems[index];
     remove(index, (Location) null);
diff --git a/src/main/java/net/starlark/java/eval/StringModule.java b/src/main/java/net/starlark/java/eval/StringModule.java
index 09cdf31..7375526 100644
--- a/src/main/java/net/starlark/java/eval/StringModule.java
+++ b/src/main/java/net/starlark/java/eval/StringModule.java
@@ -272,7 +272,7 @@
         @Param(name = "new", type = String.class, doc = "The string to replace with."),
         @Param(
             name = "count",
-            type = Integer.class,
+            type = StarlarkInt.class,
             noneable = true, // TODO(#11244): Set false once incompatible flag is deleted.
             defaultValue = "unbound",
             doc =
@@ -297,13 +297,16 @@
                 + "can temporarily opt out of this change by setting "
                 + "--incompatible_string_replace_count=false.)");
       }
-      if (countUnchecked != Starlark.UNBOUND && (Integer) countUnchecked >= 0) {
-        count = (Integer) countUnchecked;
+      if (countUnchecked != Starlark.UNBOUND) {
+        int x = Starlark.toInt(countUnchecked, "count");
+        if (x >= 0) {
+          count = x;
+        }
       }
     } else {
       if (countUnchecked != Starlark.UNBOUND && countUnchecked != Starlark.NONE) {
         // Negative has same effect as 0 below.
-        count = (Integer) countUnchecked;
+        count = Starlark.toInt(countUnchecked, "count");
       }
     }
 
@@ -340,7 +343,7 @@
         @Param(name = "sep", type = String.class, doc = "The string to split on."),
         @Param(
             name = "maxsplit",
-            type = Integer.class,
+            type = StarlarkInt.class,
             noneable = true,
             defaultValue = "None",
             doc = "The maximum number of splits.")
@@ -353,7 +356,7 @@
     }
     int maxSplit = Integer.MAX_VALUE;
     if (maxSplitO != Starlark.NONE) {
-      maxSplit = (Integer) maxSplitO;
+      maxSplit = Starlark.toInt(maxSplitO, "maxsplit");
     }
     ArrayList<String> res = new ArrayList<>();
     int start = 0;
@@ -380,7 +383,7 @@
         @Param(name = "sep", type = String.class, doc = "The string to split on."),
         @Param(
             name = "maxsplit",
-            type = Integer.class,
+            type = StarlarkInt.class,
             noneable = true,
             defaultValue = "None",
             doc = "The maximum number of splits.")
@@ -393,7 +396,7 @@
     }
     int maxSplit = Integer.MAX_VALUE;
     if (maxSplitO != Starlark.NONE) {
-      maxSplit = (Integer) maxSplitO;
+      maxSplit = Starlark.toInt(maxSplitO, "maxsplit");
     }
     ArrayList<String> res = new ArrayList<>();
     int end = self.length();
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
index c5b9b38..439c451 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkRepositoryContextTest.java
@@ -60,6 +60,7 @@
 import net.starlark.java.eval.Mutability;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkFunction;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkSemantics;
 import net.starlark.java.eval.StarlarkThread;
@@ -303,7 +304,7 @@
     StarlarkPath patchFile = context.path("my.patch");
     context.createFile(
         context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
-    context.patch(patchFile, 0, thread);
+    context.patch(patchFile, StarlarkInt.of(0), thread);
     testOutputFile(foo.getPath(), String.format("line one%nline two%n"));
   }
 
@@ -314,7 +315,7 @@
     context.createFile(
         context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
     try {
-      context.patch(patchFile, 0, thread);
+      context.patch(patchFile, StarlarkInt.of(0), thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -337,7 +338,7 @@
         true,
         thread);
     try {
-      context.patch(patchFile, 0, thread);
+      context.patch(patchFile, StarlarkInt.of(0), thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -358,7 +359,7 @@
     context.createFile(
         context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
     try {
-      context.patch(patchFile, 0, thread);
+      context.patch(patchFile, StarlarkInt.of(0), thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -416,7 +417,7 @@
     StarlarkExecutionResult starlarkExecutionResult =
         context.execute(
             StarlarkList.of(/*mutability=*/ null, "/bin/cmd", "arg1"),
-            /*timeout=*/ 10,
+            /* timeoutI= */ StarlarkInt.of(10),
             /*uncheckedEnvironment=*/ Dict.empty(),
             /*quiet=*/ true,
             /*workingDirectory=*/ "",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
index 0758ec4..5635748 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/BuildTypeTest.java
@@ -32,6 +32,7 @@
 import java.util.Map;
 import net.starlark.java.eval.EvalException;
 import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -139,7 +140,7 @@
             ConversionException.class,
             () ->
                 BuildType.LABEL_KEYED_STRING_DICT.convert(
-                    ImmutableMap.of(1, "OK"), null, currentRule));
+                    ImmutableMap.of(StarlarkInt.of(1), "OK"), null, currentRule));
     assertThat(expected)
         .hasMessageThat()
         .isEqualTo("expected value of type 'string' for dict key element, but got 1 (int)");
@@ -152,7 +153,7 @@
             ConversionException.class,
             () ->
                 BuildType.LABEL_KEYED_STRING_DICT.convert(
-                    ImmutableMap.of("//actually/a:label", 3), null, currentRule));
+                    ImmutableMap.of("//actually/a:label", StarlarkInt.of(3)), null, currentRule));
     assertThat(expected)
         .hasMessageThat()
         .isEqualTo("expected value of type 'string' for dict value element, but got 3 (int)");
diff --git a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
index 776e183..f7d6110 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/TypeTest.java
@@ -107,7 +107,8 @@
   @Test
   public void testNonString() throws Exception {
     Type.ConversionException e =
-        assertThrows(Type.ConversionException.class, () -> Type.STRING.convert(3, null));
+        assertThrows(
+            Type.ConversionException.class, () -> Type.STRING.convert(StarlarkInt.of(3), null));
     assertThat(e).hasMessageThat().isEqualTo("expected value of type 'string', but got 3 (int)");
   }
 
@@ -242,7 +243,8 @@
   @Test
   public void testNonLabel() throws Exception {
     Type.ConversionException e =
-        assertThrows(Type.ConversionException.class, () -> BuildType.LABEL.convert(3, null));
+        assertThrows(
+            Type.ConversionException.class, () -> BuildType.LABEL.convert(StarlarkInt.of(3), null));
     assertThat(e).hasMessageThat().isEqualTo("expected value of type 'string', but got 3 (int)");
   }
 
@@ -281,7 +283,9 @@
   @Test
   public void testNonStringList() throws Exception {
     Type.ConversionException e =
-        assertThrows(Type.ConversionException.class, () -> Type.STRING_LIST.convert(3, "blah"));
+        assertThrows(
+            Type.ConversionException.class,
+            () -> Type.STRING_LIST.convert(StarlarkInt.of(3), "blah"));
     assertThat(e)
         .hasMessageThat()
         .isEqualTo("expected value of type 'list(string)' for blah, but got 3 (int)");
@@ -289,7 +293,7 @@
 
   @Test
   public void testStringListBadElements() throws Exception {
-    Object input = Arrays.<Object>asList("foo", "bar", 1);
+    Object input = Arrays.<Object>asList("foo", "bar", StarlarkInt.of(1));
     Type.ConversionException e =
         assertThrows(
             Type.ConversionException.class, () -> Type.STRING_LIST.convert(input, "argument quux"));
@@ -326,7 +330,7 @@
     Type.ConversionException e =
         assertThrows(
             Type.ConversionException.class,
-            () -> BuildType.LABEL_LIST.convert(3, "foo", currentRule));
+            () -> BuildType.LABEL_LIST.convert(StarlarkInt.of(3), "foo", currentRule));
     assertThat(e)
         .hasMessageThat()
         .isEqualTo("expected value of type 'list(label)' for foo, but got 3 (int)");
@@ -334,7 +338,7 @@
 
   @Test
   public void testLabelListBadElements() throws Exception {
-    Object list = Arrays.<Object>asList("//foo:bar", 2, "foo");
+    Object list = Arrays.<Object>asList("//foo:bar", StarlarkInt.of(2), "foo");
     Type.ConversionException e =
         assertThrows(
             Type.ConversionException.class,
@@ -375,8 +379,9 @@
 
   @Test
   public void testStringListDictBadFirstElement() throws Exception {
-    Object input = ImmutableMap.of(2, Arrays.asList("foo", "bar"),
-                                   "wiz", Arrays.asList("bang"));
+    Object input =
+        ImmutableMap.of(
+            StarlarkInt.of(2), Arrays.asList("foo", "bar"), "wiz", Arrays.asList("bang"));
     Type.ConversionException e =
         assertThrows(
             Type.ConversionException.class,
diff --git a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
index 4b80fae..95a81a7 100644
--- a/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlarkdebug/server/StarlarkDebugServerTest.java
@@ -56,6 +56,7 @@
 import net.starlark.java.eval.Module;
 import net.starlark.java.eval.Mutability;
 import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkList;
 import net.starlark.java.eval.StarlarkSemantics;
 import net.starlark.java.eval.StarlarkThread;
@@ -443,12 +444,12 @@
             .addScope(
                 Scope.newBuilder()
                     .setName("local")
-                    .addBinding(getValueProto("a", 2))
-                    .addBinding(getValueProto("b", 1)))
+                    .addBinding(getValueProto("a", StarlarkInt.of(2)))
+                    .addBinding(getValueProto("b", StarlarkInt.of(1))))
             .addScope(
                 Scope.newBuilder()
                     .setName("global")
-                    .addBinding(getValueProto("c", 3))
+                    .addBinding(getValueProto("c", StarlarkInt.of(3)))
                     .addBinding(getValueProto("fn", module.getGlobal("fn"))))
             .build());
 
@@ -464,8 +465,8 @@
             .addScope(
                 Scope.newBuilder()
                     .setName("global")
-                    .addBinding(getValueProto("a", 1))
-                    .addBinding(getValueProto("c", 3))
+                    .addBinding(getValueProto("a", StarlarkInt.of(1)))
+                    .addBinding(getValueProto("c", StarlarkInt.of(3)))
                     .addBinding(getValueProto("fn", module.getGlobal("fn"))))
             .build());
   }
@@ -493,7 +494,8 @@
                     EvaluateRequest.newBuilder().setThreadId(threadId).setStatement("x[1]").build())
                 .build());
     assertThat(response.hasEvaluate()).isTrue();
-    assertThat(response.getEvaluate().getResult()).isEqualTo(getValueProto("Evaluation result", 2));
+    assertThat(response.getEvaluate().getResult())
+        .isEqualTo(getValueProto("Evaluation result", StarlarkInt.of(2)));
   }
 
   @Test
@@ -526,7 +528,9 @@
 
     ListFramesResponse frames = listFrames(threadId);
     assertThat(frames.getFrame(0).getScope(0).getBindingList())
-        .contains(getValueProto("x", StarlarkList.of(/*mutability=*/ null, 5, 6)));
+        .contains(
+            getValueProto(
+                "x", StarlarkList.of(/*mutability=*/ null, StarlarkInt.of(5), StarlarkInt.of(6))));
   }
 
   @Test
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 0604898..7b0e11c 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
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -39,9 +40,9 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       })
-  public String conflictingMethodTwo(String one, Integer two) {
+  public String conflictingMethodTwo(String one, StarlarkInt two) {
     return "foo";
   }
 }
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java b/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
index d38f033..0cf2a7b 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/DisabledValueParamNoToggle.java
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -31,7 +32,7 @@
         @Param(name = "one", named = true, positional = true),
         @Param(name = "two", named = true, valueWhenDisabled = "3", positional = true)
       })
-  public Integer noToggleMethod(Integer one, Integer two) {
+  public Integer noToggleMethod(StarlarkInt one, StarlarkInt two) {
     return 42;
   }
 }
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 c4b9e67..01abb8c 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
@@ -30,11 +30,11 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       enableOnlyWithFlag = FOO,
       disableWithFlag = FOO)
-  public String someMethod(String one, Integer two) {
+  public String someMethod(String one, StarlarkInt two) {
     return "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 a891499..fd2c654 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
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -33,12 +34,12 @@
         @Param(name = "one", type = String.class, named = true),
         @Param(
             name = "two",
-            type = Integer.class,
+            type = StarlarkInt.class,
             named = true,
             enableOnlyWithFlag = FOO,
             disableWithFlag = FOO),
       })
-  public String someMethod(String one, Integer two) {
+  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 a605fa8..33940c1 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
@@ -18,6 +18,7 @@
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkSemantics;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
@@ -48,7 +49,7 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
         @Param(
             name = "three",
             type = String.class,
@@ -56,7 +57,7 @@
             defaultValue = "None",
             noneable = true),
       })
-  public String threeArgMethod(String one, Integer two, Object three) {
+  public String threeArgMethod(String one, StarlarkInt two, Object three) {
     return "bar";
   }
 
@@ -65,12 +66,12 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
         @Param(name = "three", type = String.class, named = true),
       },
       useStarlarkThread = true)
   public String threeArgMethodWithParams(
-      String one, Integer two, String three, StarlarkThread thread) {
+      String one, StarlarkInt two, String three, StarlarkThread thread) {
     return "baz";
   }
 
@@ -105,12 +106,12 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       extraKeywords = @Param(name = "kwargs"),
       useStarlarkThread = true)
   public String twoArgMethodWithParamsAndInfoAndKwargs(
-      String one, Integer two, Dict<String, Object> kwargs, StarlarkThread thread) {
+      String one, StarlarkInt two, Dict<String, Object> kwargs, StarlarkThread thread) {
     return "blep";
   }
 
@@ -119,13 +120,13 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       extraPositionals = @Param(name = "args"),
       extraKeywords = @Param(name = "kwargs"),
       useStarlarkThread = true)
   public String twoArgMethodWithParamsAndInfoAndKwargs(
-      String one, Integer two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
+      String one, StarlarkInt two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
     return "yar";
   }
 
@@ -134,10 +135,10 @@
       selfCall = true,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       documented = false)
-  public Integer selfCallMethod(String one, Integer two) {
+  public Integer selfCallMethod(String one, StarlarkInt two) {
     return 0;
   }
 
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 d4f0dc4..893056c 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
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /** Test case for a class with multiple StarlarkMethod methods which have selfCall=true. */
@@ -26,15 +27,15 @@
       selfCall = true,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       documented = false)
-  public Integer selfCallMethod(String one, Integer two) {
+  public StarlarkInt selfCallMethod(String one, StarlarkInt two) {
     return 0;
   }
 
   @StarlarkMethod(name = "selfCallMethodTwo", selfCall = true, documented = false)
-  public Integer selfCallMethodTwo() {
+  public StarlarkInt selfCallMethodTwo() {
     return 0;
   }
 }
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java b/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
index 1c5d75c..4701f0c 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/NonDefaultParamAfterDefault.java
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -31,7 +32,7 @@
         @Param(name = "one", named = true, defaultValue = "1", positional = true),
         @Param(name = "two", named = true, positional = true)
       })
-  public Integer nonDefaultAfterDefault(Integer one, Integer two) {
+  public Integer nonDefaultAfterDefault(StarlarkInt one, StarlarkInt two) {
     return 42;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
index b3916db..56ddbfd 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalOnlyParamAfterNamed.java
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -31,7 +32,7 @@
         @Param(name = "one", named = true, positional = true),
         @Param(name = "two", named = false, positional = true)
       })
-  public Integer positionalOnlyAfterNamed(Integer one, Integer two) {
+  public Integer positionalOnlyAfterNamed(StarlarkInt one, StarlarkInt two) {
     return 42;
   }
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
index a003bdf..ab252b3 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/PositionalParamAfterNonPositional.java
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -31,7 +32,7 @@
         @Param(name = "one", named = true, positional = false),
         @Param(name = "two", named = true, positional = true)
       })
-  public Integer positionalAfterNonPositional(Integer one, Integer two) {
+  public Integer positionalAfterNonPositional(StarlarkInt one, StarlarkInt two) {
     return 42;
   }
-}
\ No newline at end of file
+}
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 59009f1..fb28b66 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
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -29,11 +30,11 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
         @Param(name = "three", type = String.class, named = true)
       },
       useStarlarkThread = true)
-  public String threeArgMethod(StarlarkThread thread, String one, Integer two, String three) {
+  public String threeArgMethod(StarlarkThread thread, String one, StarlarkInt two, String three) {
     return "bar";
   }
 }
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 034d546..6b1a1f1 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
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -29,10 +30,10 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       useStarlarkThread = true)
-  public String threeArgMethod(String one, Integer two, String shouldBeThread) {
+  public String threeArgMethod(String one, StarlarkInt two, String shouldBeThread) {
     return "bar";
   }
 }
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 95a1e0f..1f57f8d 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
@@ -18,6 +18,7 @@
 import net.starlark.java.annot.StarlarkMethod;
 import net.starlark.java.eval.Dict;
 import net.starlark.java.eval.Sequence;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkThread;
 import net.starlark.java.eval.StarlarkValue;
 
@@ -34,13 +35,13 @@
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "two", type = StarlarkInt.class, named = true),
       },
       extraPositionals = @Param(name = "args"),
       extraKeywords = @Param(name = "kwargs", enableOnlyWithFlag = FOO),
       useStarlarkThread = true)
   public String toggledKwargsMethod(
-      String one, Integer two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
+      String one, StarlarkInt two, Sequence<?> args, Dict<?, ?> kwargs, StarlarkThread thread) {
     return "cat";
   }
 }
diff --git a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
index 5df4e82..de0a494 100644
--- a/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
+++ b/src/test/java/net/starlark/java/annot/processor/testsources/ToggledParamNoDisabledValue.java
@@ -16,6 +16,7 @@
 
 import net.starlark.java.annot.Param;
 import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.StarlarkInt;
 import net.starlark.java.eval.StarlarkValue;
 
 /**
@@ -33,7 +34,7 @@
         @Param(name = "one", named = true, positional = true),
         @Param(name = "two", named = true, enableOnlyWithFlag = FOO, positional = true)
       })
-  public Integer noDisabledValueMethod(Integer one, Integer two) {
+  public Integer noDisabledValueMethod(StarlarkInt one, StarlarkInt two) {
     return 42;
   }
 }
diff --git a/src/test/java/net/starlark/java/eval/EvalUtilsTest.java b/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
index 71bd1f7..1d4a63e 100644
--- a/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
+++ b/src/test/java/net/starlark/java/eval/EvalUtilsTest.java
@@ -17,6 +17,8 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertThrows;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import java.math.BigInteger;
 import javax.annotation.Nullable;
 import net.starlark.java.annot.StarlarkBuiltin;
@@ -50,13 +52,20 @@
   @Test
   public void testDataTypeNames() throws Exception {
     assertThat(Starlark.type("foo")).isEqualTo("string");
-    assertThat(Starlark.type(3)).isEqualTo("int");
+    assertThat(Starlark.type(StarlarkInt.of(3))).isEqualTo("int");
     assertThat(Starlark.type(Tuple.of(1, 2, 3))).isEqualTo("tuple");
     assertThat(Starlark.type(makeList(null))).isEqualTo("list");
     assertThat(Starlark.type(makeDict(null))).isEqualTo("dict");
     assertThat(Starlark.type(Starlark.NONE)).isEqualTo("NoneType");
     assertThat(Starlark.type(new MockClassA())).isEqualTo("MockClassA");
     assertThat(Starlark.type(new MockClassB())).isEqualTo("MockClassA");
+
+    // Not legal values, but relied upon by (e.g.) ApiExporter
+    // when formatting the result type of an annotated method.
+    // Other types accepted by fromJava are treated similarly.
+    assertThat(Starlark.type(3)).isEqualTo("int");
+    assertThat(Starlark.type(ImmutableList.of())).isEqualTo("List");
+    assertThat(Starlark.type(ImmutableMap.of())).isEqualTo("Map");
   }
 
   @Test
diff --git a/src/test/java/net/starlark/java/eval/EvaluationTest.java b/src/test/java/net/starlark/java/eval/EvaluationTest.java
index e397239..03c68c8 100644
--- a/src/test/java/net/starlark/java/eval/EvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/EvaluationTest.java
@@ -139,7 +139,9 @@
 
     class C {
       long run(int n) throws SyntaxError.Exception, EvalException, InterruptedException {
-        Module module = Module.withPredeclared(StarlarkSemantics.DEFAULT, ImmutableMap.of("n", n));
+        Module module =
+            Module.withPredeclared(
+                StarlarkSemantics.DEFAULT, ImmutableMap.of("n", StarlarkInt.of(n)));
         long steps0 = thread.getExecutedSteps();
         Starlark.execFile(input, FileOptions.DEFAULT, module, thread);
         return thread.getExecutedSteps() - steps0;
diff --git a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
index d8e121b..4f3a9d3a 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkEvaluationTest.java
@@ -186,11 +186,11 @@
         name = "nullfunc_failing",
         parameters = {
           @Param(name = "p1", type = String.class),
-          @Param(name = "p2", type = Integer.class),
+          @Param(name = "p2", type = StarlarkInt.class),
         },
         documented = false,
         allowReturnNones = false)
-    public StarlarkValue nullfuncFailing(String p1, Integer p2) {
+    public StarlarkValue nullfuncFailing(String p1, StarlarkInt p2) {
       return null;
     }
 
@@ -244,7 +244,7 @@
               named = true),
           @Param(
               name = "noneable",
-              type = Integer.class,
+              type = StarlarkInt.class,
               defaultValue = "None",
               noneable = true,
               positional = false,
@@ -253,8 +253,8 @@
               name = "multi",
               allowedTypes = {
                 @ParamType(type = String.class),
-                @ParamType(type = Integer.class),
-                @ParamType(type = Sequence.class, generic1 = Integer.class),
+                @ParamType(type = StarlarkInt.class),
+                @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
               },
               defaultValue = "None",
               noneable = true,
@@ -262,7 +262,7 @@
               named = true)
         })
     public String withParams(
-        Integer pos1,
+        StarlarkInt pos1,
         boolean pos2,
         boolean posOrNamed,
         boolean named,
@@ -319,7 +319,7 @@
               named = true),
           @Param(
               name = "noneable",
-              type = Integer.class,
+              type = StarlarkInt.class,
               defaultValue = "None",
               noneable = true,
               positional = false,
@@ -328,8 +328,8 @@
               name = "multi",
               allowedTypes = {
                 @ParamType(type = String.class),
-                @ParamType(type = Integer.class),
-                @ParamType(type = Sequence.class, generic1 = Integer.class),
+                @ParamType(type = StarlarkInt.class),
+                @ParamType(type = Sequence.class, generic1 = StarlarkInt.class),
               },
               defaultValue = "None",
               noneable = true,
@@ -338,7 +338,7 @@
         },
         useStarlarkThread = true)
     public String withParamsAndExtraInterpreterParams(
-        Integer pos1,
+        StarlarkInt pos1,
         boolean pos2,
         boolean posOrNamed,
         boolean named,
@@ -388,14 +388,14 @@
         name = "with_args_and_thread",
         documented = false,
         parameters = {
-          @Param(name = "pos1", type = Integer.class),
+          @Param(name = "pos1", type = StarlarkInt.class),
           @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
           @Param(name = "named", type = Boolean.class, positional = false, named = true),
         },
         extraPositionals = @Param(name = "args"),
         useStarlarkThread = true)
     public String withArgsAndThread(
-        Integer pos1, boolean pos2, boolean named, Sequence<?> args, StarlarkThread thread) {
+        StarlarkInt pos1, boolean pos2, boolean named, Sequence<?> args, StarlarkThread thread) {
       String argsString = debugPrintArgs(args);
       return "with_args_and_thread("
           + pos1
@@ -454,24 +454,6 @@
       throw new InternalError("buggy code");
     }
 
-    @StarlarkMethod(
-        name = "int_conversion",
-        doc = "test implicit StarlarkInt to Integer conversion",
-        parameters = {
-          @Param(name = "a", type = Integer.class),
-          @Param(
-              name = "b",
-              allowedTypes = {
-                @ParamType(type = String.class),
-                @ParamType(type = Integer.class),
-              }),
-          @Param(name = "c"),
-          @Param(name = "d"),
-        })
-    public String intConversion(Object a, Object b, Integer c, Object d) {
-      return String.format("(%s, %s, %s, %s)", a, b, c, d);
-    }
-
     @Override
     public String toString() {
       return "<mock>";
@@ -922,8 +904,8 @@
   }
 
   @SuppressWarnings("unchecked")
-  private void nestedLoopsTest(String statement, Integer outerExpected, int firstExpected,
-      int secondExpected) throws Exception {
+  private void nestedLoopsTest(
+      String statement, int outerExpected, int firstExpected, int secondExpected) throws Exception {
     ev.exec(
         "def foo():",
         "   outer = 0",
@@ -1908,7 +1890,6 @@
         .testExactOrder(
             "dir(mock)",
             "function",
-            "int_conversion",
             "interrupted_struct_field",
             "is_empty",
             "nullfunc_failing",
@@ -2122,23 +2103,4 @@
             () -> Starlark.addMethods(ImmutableMap.builder(), new Mock()));
     assertThat(ex).hasMessageThat().contains("method struct_field has structField=true");
   }
-
-  @Test
-  public void testIntegerReboxing() throws Exception {
-    ev.new Scenario()
-        .update("mock", new Mock())
-        .setUp("big = 111111111 * 111111111")
-        .testExpression("mock.int_conversion(1, 2, 3, 4)", "(1, 2, 3, 4)")
-        .testExpression("mock.int_conversion(1, 'b', 3, 'd')", "(1, b, 3, d)")
-        .testIfErrorContains(
-            "got 12345678987654321 for a, want value in signed 32-bit range",
-            "mock.int_conversion(big, 0, 0, 0)")
-        .testIfErrorContains(
-            "got 12345678987654321 for b, want value in signed 32-bit range",
-            "mock.int_conversion(0, big, 0, 0)")
-        .testIfErrorContains(
-            "got 12345678987654321 for c, want value in signed 32-bit range",
-            "mock.int_conversion(0, 0, big, 0)")
-        .testExpression("mock.int_conversion(0, 0, 0, big)", "(0, 0, 0, 12345678987654321)");
-  }
 }
diff --git a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
index aad859d..3e4c4bd 100644
--- a/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
+++ b/src/test/java/net/starlark/java/eval/StarlarkFlagGuardingTest.java
@@ -54,7 +54,7 @@
         name = "positionals_only_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = true, named = false, type = Integer.class),
+          @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
           @Param(
               name = "b",
               positional = true,
@@ -62,10 +62,11 @@
               type = Boolean.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "False"),
-          @Param(name = "c", positional = true, named = false, type = Integer.class),
+          @Param(name = "c", positional = true, named = false, type = StarlarkInt.class),
         },
         useStarlarkThread = true)
-    public String positionalsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
+    public String positionalsOnlyMethod(
+        StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
       return "positionals_only_method(" + a + ", " + b + ", " + c + ")";
     }
 
@@ -73,7 +74,7 @@
         name = "keywords_only_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = false, named = true, type = Integer.class),
+          @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
           @Param(
               name = "b",
               positional = false,
@@ -81,10 +82,11 @@
               type = Boolean.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "False"),
-          @Param(name = "c", positional = false, named = true, type = Integer.class),
+          @Param(name = "c", positional = false, named = true, type = StarlarkInt.class),
         },
         useStarlarkThread = true)
-    public String keywordsOnlyMethod(Integer a, boolean b, Integer c, StarlarkThread thread) {
+    public String keywordsOnlyMethod(
+        StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
       return "keywords_only_method(" + a + ", " + b + ", " + c + ")";
     }
 
@@ -92,7 +94,7 @@
         name = "mixed_params_method",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = true, named = false, type = Integer.class),
+          @Param(name = "a", positional = true, named = false, type = StarlarkInt.class),
           @Param(
               name = "b",
               positional = true,
@@ -104,14 +106,14 @@
               name = "c",
               positional = false,
               named = true,
-              type = Integer.class,
+              type = StarlarkInt.class,
               enableOnlyWithFlag = EXPERIMENTAL_FLAG,
               valueWhenDisabled = "3"),
           @Param(name = "d", positional = false, named = true, type = Boolean.class),
         },
         useStarlarkThread = true)
     public String mixedParamsMethod(
-        Integer a, boolean b, Integer c, boolean d, StarlarkThread thread) {
+        StarlarkInt a, boolean b, StarlarkInt c, boolean d, StarlarkThread thread) {
       return "mixed_params_method(" + a + ", " + b + ", " + c + ", " + d + ")";
     }
 
@@ -119,7 +121,7 @@
         name = "keywords_multiple_flags",
         documented = false,
         parameters = {
-          @Param(name = "a", positional = false, named = true, type = Integer.class),
+          @Param(name = "a", positional = false, named = true, type = StarlarkInt.class),
           @Param(
               name = "b",
               positional = false,
@@ -131,12 +133,13 @@
               name = "c",
               positional = false,
               named = true,
-              type = Integer.class,
+              type = StarlarkInt.class,
               enableOnlyWithFlag = FLAG1,
               valueWhenDisabled = "3"),
         },
         useStarlarkThread = true)
-    public String keywordsMultipleFlags(Integer a, boolean b, Integer c, StarlarkThread thread) {
+    public String keywordsMultipleFlags(
+        StarlarkInt a, boolean b, StarlarkInt c, StarlarkThread thread) {
       return "keywords_multiple_flags(" + a + ", " + b + ", " + c + ")";
     }
   }