diff --git a/src/test/java/org/eclipse/yasson/jsonstructure/Issue707.java b/src/test/java/org/eclipse/yasson/jsonstructure/Issue707.java
new file mode 100644
index 0000000..c9a9836
--- /dev/null
+++ b/src/test/java/org/eclipse/yasson/jsonstructure/Issue707.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.yasson.jsonstructure;
+
+import jakarta.json.bind.annotation.JsonbTypeDeserializer;
+import jakarta.json.bind.serializer.DeserializationContext;
+import jakarta.json.bind.serializer.JsonbDeserializer;
+import jakarta.json.stream.JsonParser;
+import java.lang.reflect.Type;
+import java.util.Objects;
+
+/**
+ * Test resources for Issue #707: YassonParser.isIntegralNumber throws JsonbException 
+ * instead of IllegalStateException.
+ * 
+ * This replicates the user's scenario where they want to handle both numeric and 
+ * string IDs by catching IllegalStateException when the value is not a number.
+ */
+public class Issue707 {
+    
+    /**
+     * Simple ID wrapper that can be created from either a long or a string.
+     */
+    public static class RequestId {
+        private final String value;
+        
+        private RequestId(String value) {
+            this.value = value;
+        }
+        
+        public static RequestId of(long id) {
+            return new RequestId(String.valueOf(id));
+        }
+        
+        public static RequestId of(String id) {
+            return new RequestId(id);
+        }
+        
+        public String getValue() {
+            return value;
+        }
+        
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            RequestId requestId = (RequestId) o;
+            return Objects.equals(value, requestId.value);
+        }
+        
+        @Override
+        public int hashCode() {
+            return Objects.hash(value);
+        }
+        
+        @Override
+        public String toString() {
+            return "RequestId{" + value + "}";
+        }
+    }
+    
+    /**
+     * Container class that uses a custom deserializer for the ID field.
+     */
+    public static class Request {
+        private RequestId id;
+        
+        @JsonbTypeDeserializer(RequestIdDeserializer.class)
+        public RequestId getId() {
+            return id;
+        }
+        
+        public void setId(RequestId id) {
+            this.id = id;
+        }
+    }
+    
+    /**
+     * Custom deserializer that handles both numeric and string IDs.
+     * This is the exact pattern from the issue report.
+     */
+    public static class RequestIdDeserializer implements JsonbDeserializer<RequestId> {
+        @Override
+        public RequestId deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+            RequestId id = null;
+            try {
+                // Try to read as a number first
+                if (parser.isIntegralNumber()) {
+                    id = RequestId.of(parser.getLong());
+                } else {
+                    // Not an integral number, but is still a number
+                    id = RequestId.of(parser.getBigDecimal().toString());
+                }
+            } catch (IllegalStateException e) {
+                id = RequestId.of(parser.getString());
+            }
+            return id;
+        }
+    }
+}
+
diff --git a/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java b/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java
index d76984e..37d4f15 100644
--- a/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java
+++ b/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java
@@ -322,4 +322,69 @@
         assertEquals("test1, test2", tags);
     }
 
+    /**
+     * Test for Issue #707: isIntegralNumber() should throw IllegalStateException, not JsonbException
+     * when called on a non-numeric value.
+     *
+     * This test verifies that the user's code pattern from the issue works correctly:
+     * - When the value is a string, isIntegralNumber() throws IllegalStateException
+     * - The exception can be caught and the value read as a string
+     */
+    @Test
+    public void isIntegralNumberThrowsIllegalStateException() {
+        // Test with string ID - should catch IllegalStateException and handle gracefully
+        // This test uses fromJsonStructure to exercise JsonStructureToParserAdapter
+        JsonObjectBuilder objectBuilder = jsonProvider.createObjectBuilder();
+        objectBuilder.add("id", "abc123");
+        JsonObject jsonObject = objectBuilder.build();
+        
+        YassonJsonb jsonb = (YassonJsonb) JsonbBuilder.create();
+        Issue707.Request result = jsonb.fromJsonStructure(jsonObject, Issue707.Request.class);
+        
+        assertNotNull(result);
+        assertNotNull(result.getId());
+        assertEquals("abc123", result.getId().getValue());
+    }
+    
+    /**
+     * Test for Issue #707: Verify that an integral ID still works correctly.
+     */
+    @Test
+    public void isIntegralNumberWithNumericValue() {
+        // Test with numeric ID - should work without throwing any exception
+        // This test uses fromJsonStructure to exercise JsonStructureToParserAdapter
+        JsonObjectBuilder objectBuilder = jsonProvider.createObjectBuilder();
+        objectBuilder.add("id", 12345);
+        JsonObject jsonObject = objectBuilder.build();
+        
+        YassonJsonb jsonb = (YassonJsonb) JsonbBuilder.create();
+        Issue707.Request result = jsonb.fromJsonStructure(jsonObject, Issue707.Request.class);
+        
+        assertNotNull(result);
+        assertNotNull(result.getId());
+        assertEquals("12345", result.getId().getValue());
+    }
+    
+    /**
+     * Test for Issue #707: Verify that floating point numbers are handled correctly.
+     * isIntegralNumber() should return false for non-integral numbers.
+     * isIntegralNumber() should not throw an exception for floating point numbers.
+     */
+    @Test
+    public void isIntegralNumberWithFloatingPoint() {
+        // Test with floating point ID - isIntegralNumber() returns false,
+        // so the else block handles it as a string
+        // This test uses fromJsonStructure to exercise JsonStructureToParserAdapter
+        JsonObjectBuilder objectBuilder = jsonProvider.createObjectBuilder();
+        objectBuilder.add("id", 123.45);
+        JsonObject jsonObject = objectBuilder.build();
+        
+        YassonJsonb jsonb = (YassonJsonb) JsonbBuilder.create();
+        Issue707.Request result = jsonb.fromJsonStructure(jsonObject, Issue707.Request.class);
+        
+        assertNotNull(result);
+        assertNotNull(result.getId());
+        // The deserializer will read it as a string when isIntegralNumber() returns false
+        assertEquals("123.45", result.getId().getValue());
+    }
 }
