diff --git a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
index 415332f005906..7a9c187ee4f98 100644
--- a/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
+++ b/src/java.base/share/classes/java/lang/classfile/ClassSignature.java
@@ -34,6 +35,11 @@
 /**
  * Models the generic signature of a class or interface, as defined by JVMS
  * {@jvms 4.7.9.1}.
+ * <p>
+ * Similar to nominal descriptors from {@link java.lang.constant}, {@code
+ * ClassSignature} can represent generic signatures that cannot be represented in
+ * classfile.  There is no classfile representation checks for string or nominal
+ * descriptor arguments passed to static factory methods in this class.
  *
  * @see Class
  * @see SignatureAttribute
@@ -104,6 +110,7 @@ public static ClassSignature of(List<Signature.TypeParam> typeParameters,
 
     /**
      * Parses a raw class signature string into a {@linkplain Signature}.
+     * The string may be unrepresentable by a {@link Utf8Entry}.
      *
      * @param classSignature the raw class signature string
      * @return class signature
diff --git a/src/java.base/share/classes/java/lang/classfile/MethodSignature.java b/src/java.base/share/classes/java/lang/classfile/MethodSignature.java
index 76251cd4d8e2e..0da8e6870593d 100644
--- a/src/java.base/share/classes/java/lang/classfile/MethodSignature.java
+++ b/src/java.base/share/classes/java/lang/classfile/MethodSignature.java
@@ -38,6 +39,11 @@
 /**
  * Models the generic signature of a method or constructor, as defined by JVMS
  * {@jvms 4.7.9.1}.
+ * <p>
+ * Similar to nominal descriptors from {@link java.lang.constant}, {@code
+ * MethodSignature} can represent generic signatures that cannot be represented in
+ * classfile.  There is no classfile representation checks for string or nominal
+ * descriptor arguments passed to static factory methods in this class.
  *
  * @see Executable
  * @see SignatureAttribute
@@ -147,6 +153,7 @@ public static MethodSignature of(List<Signature.TypeParam> typeParameters,
 
     /**
      * Parses a raw method signature string into a {@code MethodSignature}.
+     * The string may be unrepresentable by a {@link Utf8Entry}.
      *
      * @param methodSignature the raw method signature string
      * @return the parsed method signature
diff --git a/src/java.base/share/classes/java/lang/classfile/Signature.java b/src/java.base/share/classes/java/lang/classfile/Signature.java
index 594c7822e9829..72e991287ef8a 100644
--- a/src/java.base/share/classes/java/lang/classfile/Signature.java
+++ b/src/java.base/share/classes/java/lang/classfile/Signature.java
@@ -48,6 +49,11 @@
  * not be empty and must not contain any of the ASCII characters {@code
  * . ; [ / < > :}.  Top-level class and interface names are denoted by
  * slash-separated identifiers.
+ * <p>
+ * Similar to nominal descriptors from {@link java.lang.constant}, {@code
+ * Signature} can represent type signatures that cannot be represented in
+ * classfile.  There is no classfile representation checks for string or nominal
+ * descriptor arguments passed to static factory methods in this class.
  *
  * @see Type
  * @see SignatureAttribute
@@ -62,7 +68,8 @@ public sealed interface Signature {
     String signatureString();
 
     /**
-     * Parses a Java type signature from a raw string.
+     * Parses a Java type signature from a raw string.  The string may be
+     * unrepresentable by a {@link Utf8Entry}.
      *
      * @param javaTypeSignature raw Java type signature string
      * @return a Java type signature
diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/SignatureAttribute.java b/src/java.base/share/classes/java/lang/classfile/attribute/SignatureAttribute.java
index 2be07e38a58b8..f382b4f405302 100644
--- a/src/java.base/share/classes/java/lang/classfile/attribute/SignatureAttribute.java
+++ b/src/java.base/share/classes/java/lang/classfile/attribute/SignatureAttribute.java
@@ -107,6 +107,8 @@ default Signature asTypeSignature() {
      * {@return a {@code Signature} attribute for a class}
      *
      * @param classSignature the class signature
+     * @throws IllegalArgumentException if the raw signature string is not
+     *         representable by a {@link Utf8Entry}
      */
     static SignatureAttribute of(ClassSignature classSignature) {
         return of(TemporaryConstantPool.INSTANCE.utf8Entry(classSignature.signatureString()));
@@ -116,6 +118,8 @@ static SignatureAttribute of(ClassSignature classSignature) {
      * {@return a {@code Signature} attribute for a method}
      *
      * @param methodSignature the method signature
+     * @throws IllegalArgumentException if the raw signature string is not
+     *         representable by a {@link Utf8Entry}
      */
     static SignatureAttribute of(MethodSignature methodSignature) {
         return of(TemporaryConstantPool.INSTANCE.utf8Entry(methodSignature.signatureString()));
@@ -125,6 +129,8 @@ static SignatureAttribute of(MethodSignature methodSignature) {
      * {@return a {@code Signature} attribute for a field or a record component}
      *
      * @param signature the Java type signature
+     * @throws IllegalArgumentException if the raw signature string is not
+     *         representable by a {@link Utf8Entry}
      */
     static SignatureAttribute of(Signature signature) {
         return of(TemporaryConstantPool.INSTANCE.utf8Entry(signature.signatureString()));
diff --git a/src/java.base/share/classes/java/lang/classfile/attribute/package-info.java b/src/java.base/share/classes/java/lang/classfile/attribute/package-info.java
index 1ddd0511d8559..5d781a92cd970 100644
--- a/src/java.base/share/classes/java/lang/classfile/attribute/package-info.java
+++ b/src/java.base/share/classes/java/lang/classfile/attribute/package-info.java
@@ -32,9 +32,11 @@
  * including {@link Attribute}, {@link AttributedElement}, {@link AttributeMapper}, and {@link CustomAttribute}, which
  * do not reside in this package.
  * <p>
- * Unless otherwise specified, passing {@code null} or an array or collection containing a {@code null} element as an
- * argument to a constructor or method of any Class-File API class or interface will cause a {@link NullPointerException}
- * to be thrown.
+ * Unless otherwise noted, passing null or an array or collection that contains null as an element to a constructor or
+ * method of any Class-File API class or interface will cause a {@link NullPointerException} to be thrown; passing any
+ * string or nominal descriptor that cannot be represented in classfile, or an array or collection that contains such a
+ * string or nominal descriptor as an element to a constructor or method of any Class-File API class or interface will
+ * cause an {@link IllegalArgumentException} to be thrown.
  *
  * <h2 id="reading">Reading Attributes</h2>
  * The general way to obtain attributes is through {@link AttributedElement}.  In addition to that, many attributes
diff --git a/src/java.base/share/classes/java/lang/classfile/constantpool/package-info.java b/src/java.base/share/classes/java/lang/classfile/constantpool/package-info.java
index 66e72496d3a31..30197a6d3e6fd 100644
--- a/src/java.base/share/classes/java/lang/classfile/constantpool/package-info.java
+++ b/src/java.base/share/classes/java/lang/classfile/constantpool/package-info.java
@@ -30,9 +30,11 @@
  * {@code class} file format.  Constant pool entries are low-level models to faithfully represent the exact structure
  * of a {@code class} file.
  * <p>
- * Unless otherwise specified, passing {@code null} or an array or collection containing a {@code null} element as an
- * argument to a constructor or method of any Class-File API class or interface will cause a {@link NullPointerException}
- * to be thrown.
+ * Unless otherwise noted, passing null or an array or collection that contains null as an element to a constructor or
+ * method of any Class-File API class or interface will cause a {@link NullPointerException} to be thrown; passing any
+ * string or nominal descriptor that cannot be represented in classfile, or an array or collection that contains such a
+ * string or nominal descriptor as an element to a constructor or method of any Class-File API class or interface will
+ * cause an {@link IllegalArgumentException} to be thrown.
  *
  * <h2 id="reading">Reading the constant pool entries</h2>
  * When read from {@code class} files, the pool entries are lazily inflated; the contents of these entries, besides the
diff --git a/src/java.base/share/classes/java/lang/classfile/instruction/package-info.java b/src/java.base/share/classes/java/lang/classfile/instruction/package-info.java
index e732aadf1ec47..b0e11824471d1 100644
--- a/src/java.base/share/classes/java/lang/classfile/instruction/package-info.java
+++ b/src/java.base/share/classes/java/lang/classfile/instruction/package-info.java
@@ -29,9 +29,11 @@
  * The {@code java.lang.classfile.instruction} package contains interfaces describing code instructions.
  * Implementations of these interfaces are immutable.
  * <p>
- * Unless otherwise specified, passing {@code null} or an array or collection containing a {@code null} element as an
- * argument to a constructor or method of any Class-File API class or interface will cause a {@link NullPointerException}
- * to be thrown.
+ * Unless otherwise noted, passing null or an array or collection that contains null as an element to a constructor or
+ * method of any Class-File API class or interface will cause a {@link NullPointerException} to be thrown; passing any
+ * string or nominal descriptor that cannot be represented in classfile, or an array or collection that contains such a
+ * string or nominal descriptor as an element to a constructor or method of any Class-File API class or interface will
+ * cause an {@link IllegalArgumentException} to be thrown.
  *
  * <h2 id="reading">Reading of instructions</h2>
  * Instructions and pseudo-instructions are usually accessed from a {@link CodeModel}, such as {@link CodeModel#forEach
diff --git a/src/java.base/share/classes/java/lang/classfile/package-info.java b/src/java.base/share/classes/java/lang/classfile/package-info.java
index da9ad7fbf0d89..79f26aac907c5 100644
--- a/src/java.base/share/classes/java/lang/classfile/package-info.java
+++ b/src/java.base/share/classes/java/lang/classfile/package-info.java
@@ -250,12 +250,6 @@
  * the convenience method {@code CodeBuilder.invoke}, which in turn behaves
  * as if it calls method {@code CodeBuilder.with}. This composing of method calls on the
  * builder enables the composing of transforms (as described later).
- * <p>
- * Unless otherwise noted, passing a {@code null} argument to a constructor
- * or method of any Class-File API class or interface will cause a {@link
- * NullPointerException} to be thrown. Additionally,
- * invoking a method with an array or collection containing a {@code null} element
- * will cause a {@code NullPointerException}, unless otherwise specified.
  *
  * <h3>Symbolic information</h3>
  * To describe symbolic information for classes and types, the API uses the
@@ -281,6 +275,14 @@
  * the range {@code [0, 65535]}.  In particular, any variable-sized table
  * exceeding its maximum representable size is rejected.
  * <p>
+ * Unless otherwise noted, passing null or an array or collection that contains
+ * null as an element to a constructor or method of any Class-File API class or
+ * interface will cause a {@link NullPointerException} to be thrown; passing any
+ * string or nominal descriptor that cannot be represented in classfile, or an
+ * array or collection that contains such a string or nominal descriptor as an
+ * element to a constructor or method of any Class-File API class or interface
+ * will cause an {@link IllegalArgumentException} to be thrown.
+ * <p>
  * No consistency checks are performed while building or transforming classfiles
  * (except for null and representable arguments checks). All builders and
  * classfile elements factory methods accepts the provided information without
diff --git a/src/java.base/share/classes/java/lang/constant/package-info.java b/src/java.base/share/classes/java/lang/constant/package-info.java
index 268587f1db44e..1a01e0063ccc6 100644
--- a/src/java.base/share/classes/java/lang/constant/package-info.java
+++ b/src/java.base/share/classes/java/lang/constant/package-info.java
@@ -93,6 +93,16 @@
  * and  {@link PackageDesc}. They represent module and package
  * info structures, suitable for describing modules and their content in bytecode
  * reading and writing APIs.
+ * <p>
+ * Nominal descriptors may represent entities not possible at run-time due to
+ * restrictions of the Java Virtual Machine.  For example, the {@linkplain
+ * java.io.DataInput##modified-utf-8 Modified UTF-8} representation of a class
+ * name must not have a length over 65535, and method arguments can use at most
+ * 255 slots.  These restrictions do not exist for {@link ClassDesc} or {@link
+ * MethodTypeDesc}, and their resolution through {@code resolveConstantDesc}
+ * may result in errors.  Consumers of nominal descriptors, such as bytecode
+ * reading and writing APIs, should define the behaviors when such descriptors
+ * are passed.
  *
  * @jvms 4.4 The Constant Pool
  *