diff --git a/api/src/main/java/jakarta/xml/bind/DatatypeConverterInterface.java b/api/src/main/java/jakarta/xml/bind/DatatypeConverterInterface.java
index e9dde84..361fb0b 100644
--- a/api/src/main/java/jakarta/xml/bind/DatatypeConverterInterface.java
+++ b/api/src/main/java/jakarta/xml/bind/DatatypeConverterInterface.java
@@ -73,7 +73,7 @@
      * @return
      *     A string that is the same as the input string.
      */
-    public String parseString( String lexicalXSDString );
+    String parseString(String lexicalXSDString);
 
     /**
      * Convert the string argument into a BigInteger value.
@@ -84,7 +84,7 @@
      *     A BigInteger value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDInteger} is not a valid string representation of a {@link java.math.BigInteger} value.
      */
-    public java.math.BigInteger parseInteger( String lexicalXSDInteger );
+    java.math.BigInteger parseInteger(String lexicalXSDInteger);
 
     /**
      * Convert the string argument into an int value.
@@ -95,7 +95,7 @@
      *     An int value represented byte the string argument.
      * @throws NumberFormatException {@code lexicalXSDInt} is not a valid string representation of an {@code int} value.
      */
-    public int parseInt( String lexicalXSDInt );
+    int parseInt(String lexicalXSDInt);
 
     /**
      * Converts the string argument into a long value.
@@ -106,7 +106,7 @@
      *     A long value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDLong} is not a valid string representation of a {@code long} value.
      */
-    public long parseLong( String lexicalXSDLong );
+    long parseLong(String lexicalXSDLong);
 
     /**
      * Converts the string argument into a short value.
@@ -117,7 +117,7 @@
      *     A short value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDShort} is not a valid string representation of a {@code short} value.
      */
-    public short parseShort( String lexicalXSDShort );
+    short parseShort(String lexicalXSDShort);
 
     /**
      * Converts the string argument into a BigDecimal value.
@@ -128,7 +128,7 @@
      *     A BigDecimal value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDDecimal} is not a valid string representation of {@link java.math.BigDecimal}.
      */
-    public java.math.BigDecimal parseDecimal( String lexicalXSDDecimal );
+    java.math.BigDecimal parseDecimal(String lexicalXSDDecimal);
 
     /**
      * Converts the string argument into a float value.
@@ -139,7 +139,7 @@
      *     A float value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDFloat} is not a valid string representation of a {@code float} value.
      */
-    public float parseFloat( String lexicalXSDFloat );
+    float parseFloat(String lexicalXSDFloat);
 
     /**
      * Converts the string argument into a double value.
@@ -150,7 +150,7 @@
      *     A double value represented by the string argument.
      * @throws NumberFormatException {@code lexicalXSDDouble} is not a valid string representation of a {@code double} value.
      */
-    public double parseDouble( String lexicalXSDDouble );
+    double parseDouble(String lexicalXSDDouble);
 
     /**
      * Converts the string argument into a boolean value.
@@ -161,7 +161,7 @@
      *     A boolean value represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:boolean.
      */
-    public boolean parseBoolean( String lexicalXSDBoolean );
+    boolean parseBoolean(String lexicalXSDBoolean);
 
     /**
      * Converts the string argument into a byte value.
@@ -173,7 +173,7 @@
      * @throws NumberFormatException {@code lexicalXSDByte} does not contain a parseable byte.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:byte.
      */
-    public byte parseByte( String lexicalXSDByte );
+    byte parseByte(String lexicalXSDByte);
 
     /**
      * Converts the string argument into a QName value.
@@ -191,8 +191,8 @@
      * @throws IllegalArgumentException  if string parameter does not conform to XML Schema Part 2 specification or
      *      if namespace prefix of {@code lexicalXSDQname} is not bound to a URI in NamespaceContext {@code nsc}.
      */
-    public javax.xml.namespace.QName parseQName( String lexicalXSDQName,
-                                                 javax.xml.namespace.NamespaceContext nsc);
+    javax.xml.namespace.QName parseQName(String lexicalXSDQName,
+                                         javax.xml.namespace.NamespaceContext nsc);
 
     /**
      * Converts the string argument into a Calendar value.
@@ -203,7 +203,7 @@
      *     A Calendar object represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:dateTime.
      */
-    public java.util.Calendar parseDateTime( String lexicalXSDDateTime );
+    java.util.Calendar parseDateTime(String lexicalXSDDateTime);
 
     /**
      * Converts the string argument into an array of bytes.
@@ -214,7 +214,7 @@
      *     An array of bytes represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:base64Binary
      */
-    public byte[] parseBase64Binary( String lexicalXSDBase64Binary );
+    byte[] parseBase64Binary(String lexicalXSDBase64Binary);
 
     /**
      * Converts the string argument into an array of bytes.
@@ -225,7 +225,7 @@
      *     An array of bytes represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:hexBinary.
      */
-    public byte[] parseHexBinary( String lexicalXSDHexBinary );
+    byte[] parseHexBinary(String lexicalXSDHexBinary);
 
     /**
      * Converts the string argument into a long value.
@@ -236,7 +236,7 @@
      *     A long value represented by the string argument.
      * @throws NumberFormatException if string parameter can not be parsed into a {@code long} value.
      */
-    public long parseUnsignedInt( String lexicalXSDUnsignedInt );
+    long parseUnsignedInt(String lexicalXSDUnsignedInt);
 
     /**
      * Converts the string argument into an int value.
@@ -247,7 +247,7 @@
      *     An int value represented by the string argument.
      * @throws NumberFormatException if string parameter can not be parsed into an {@code int} value.
      */
-    public int parseUnsignedShort( String lexicalXSDUnsignedShort );
+    int parseUnsignedShort(String lexicalXSDUnsignedShort);
 
     /**
      * Converts the string argument into a Calendar value.
@@ -258,7 +258,7 @@
      *     A Calendar value represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:Time.
      */
-    public java.util.Calendar parseTime( String lexicalXSDTime );
+    java.util.Calendar parseTime(String lexicalXSDTime);
 
     /**
      * Converts the string argument into a Calendar value.
@@ -269,7 +269,7 @@
      *     A Calendar value represented by the string argument.
      * @throws IllegalArgumentException if string parameter does not conform to lexical value space defined in XML Schema Part 2: Datatypes for xsd:Date.
      */
-    public java.util.Calendar parseDate( String lexicalXSDDate );
+    java.util.Calendar parseDate(String lexicalXSDDate);
 
     /**
      * Return a string containing the lexical representation of the
@@ -281,7 +281,7 @@
      *     A string containing the lexical representation of the
      *     simple type.
      */
-    public String parseAnySimpleType( String lexicalXSDAnySimpleType );
+    String parseAnySimpleType(String lexicalXSDAnySimpleType);
 
     /**
      * Converts the string argument into a string.
@@ -290,7 +290,7 @@
      * @return
      *     A string containing a lexical representation of xsd:string
      */
-    public String printString( String val );
+    String printString(String val);
 
     /**
      * Converts a BigInteger value into a string.
@@ -300,7 +300,7 @@
      *     A string containing a lexical representation of xsd:integer
      * @throws IllegalArgumentException {@code val} is null.
      */
-    public String printInteger( java.math.BigInteger val );
+    String printInteger(java.math.BigInteger val);
 
     /**
      * Converts an int value into a string.
@@ -309,7 +309,7 @@
      * @return
      *     A string containing a lexical representation of xsd:int
      */
-    public String printInt( int val );
+    String printInt(int val);
 
 
     /**
@@ -319,7 +319,7 @@
      * @return
      *     A string containing a lexical representation of xsd:long
      */
-    public String printLong( long val );
+    String printLong(long val);
 
     /**
      * Converts a short value into a string.
@@ -328,7 +328,7 @@
      * @return
      *     A string containing a lexical representation of xsd:short
      */
-    public String printShort( short val );
+    String printShort(short val);
 
     /**
      * Converts a BigDecimal value into a string.
@@ -338,7 +338,7 @@
      *     A string containing a lexical representation of xsd:decimal
      * @throws IllegalArgumentException {@code val} is null.
      */
-    public String printDecimal( java.math.BigDecimal val );
+    String printDecimal(java.math.BigDecimal val);
 
     /**
      * Converts a float value into a string.
@@ -347,7 +347,7 @@
      * @return
      *     A string containing a lexical representation of xsd:float
      */
-    public String printFloat( float val );
+    String printFloat(float val);
 
     /**
      * Converts a double value into a string.
@@ -356,7 +356,7 @@
      * @return
      *     A string containing a lexical representation of xsd:double
      */
-    public String printDouble( double val );
+    String printDouble(double val);
 
     /**
      * Converts a boolean value into a string.
@@ -365,7 +365,7 @@
      * @return
      *     A string containing a lexical representation of xsd:boolean
      */
-    public String printBoolean( boolean val );
+    String printBoolean(boolean val);
 
     /**
      * Converts a byte value into a string.
@@ -374,7 +374,7 @@
      * @return
      *     A string containing a lexical representation of xsd:byte
      */
-    public String printByte( byte val );
+    String printByte(byte val);
 
     /**
      * Converts a QName instance into a string.
@@ -387,8 +387,8 @@
      * @throws IllegalArgumentException if {@code val} is null or
      * if {@code nsc} is non-null or {@code nsc.getPrefix(nsprefixFromVal)} is null.
      */
-    public String printQName( javax.xml.namespace.QName val,
-                              javax.xml.namespace.NamespaceContext nsc );
+    String printQName(javax.xml.namespace.QName val,
+                      javax.xml.namespace.NamespaceContext nsc);
 
     /**
      * Converts a Calendar value into a string.
@@ -398,7 +398,7 @@
      *     A string containing a lexical representation of xsd:dateTime
      * @throws IllegalArgumentException if {@code val} is null.
      */
-    public String printDateTime( java.util.Calendar val );
+    String printDateTime(java.util.Calendar val);
 
     /**
      * Converts an array of bytes into a string.
@@ -408,7 +408,7 @@
      *     A string containing a lexical representation of xsd:base64Binary
      * @throws IllegalArgumentException if {@code val} is null.
      */
-    public String printBase64Binary( byte[] val );
+    String printBase64Binary(byte[] val);
 
     /**
      * Converts an array of bytes into a string.
@@ -418,7 +418,7 @@
      *     A string containing a lexical representation of xsd:hexBinary
      * @throws IllegalArgumentException if {@code val} is null.
      */
-    public String printHexBinary( byte[] val );
+    String printHexBinary(byte[] val);
 
     /**
      * Converts a long value into a string.
@@ -427,7 +427,7 @@
      * @return
      *     A string containing a lexical representation of xsd:unsignedInt
      */
-    public String printUnsignedInt( long val );
+    String printUnsignedInt(long val);
 
     /**
      * Converts an int value into a string.
@@ -436,7 +436,7 @@
      * @return
      *     A string containing a lexical representation of xsd:unsignedShort
      */
-    public String printUnsignedShort( int val );
+    String printUnsignedShort(int val);
 
     /**
      * Converts a Calendar value into a string.
@@ -446,7 +446,7 @@
      *     A string containing a lexical representation of xsd:time
      * @throws IllegalArgumentException if {@code val} is null.
      */
-    public String printTime( java.util.Calendar val );
+    String printTime(java.util.Calendar val);
 
     /**
      * Converts a Calendar value into a string.
@@ -456,7 +456,7 @@
      *     A string containing a lexical representation of xsd:date
      * @throws IllegalArgumentException if {@code val} is null.
      */
-    public String printDate( java.util.Calendar val );
+    String printDate(java.util.Calendar val);
 
     /**
      * Converts a string value into a string.
@@ -465,5 +465,5 @@
      * @return
      *     A string containing a lexical representation of xsd:AnySimpleType
      */
-    public String printAnySimpleType( String val );
+    String printAnySimpleType(String val);
 }
diff --git a/api/src/main/java/jakarta/xml/bind/Marshaller.java b/api/src/main/java/jakarta/xml/bind/Marshaller.java
index cecfe7f..f21c48a 100644
--- a/api/src/main/java/jakarta/xml/bind/Marshaller.java
+++ b/api/src/main/java/jakarta/xml/bind/Marshaller.java
@@ -303,21 +303,21 @@
      * The name of the property used to specify the output encoding in
      * the marshalled XML data.
      */
-    public static final String JAXB_ENCODING =
+    String JAXB_ENCODING =
         "jaxb.encoding";
 
     /**
      * The name of the property used to specify whether or not the marshalled
      * XML data is formatted with linefeeds and indentation.
      */
-    public static final String JAXB_FORMATTED_OUTPUT =
+    String JAXB_FORMATTED_OUTPUT =
         "jaxb.formatted.output";
 
     /**
      * The name of the property used to specify the xsi:schemaLocation
      * attribute value to place in the marshalled XML output.
      */
-    public static final String JAXB_SCHEMA_LOCATION =
+    String JAXB_SCHEMA_LOCATION =
         "jaxb.schemaLocation";
 
     /**
@@ -325,14 +325,14 @@
      * xsi:noNamespaceSchemaLocation attribute value to place in the marshalled
      * XML output.
      */
-    public static final String JAXB_NO_NAMESPACE_SCHEMA_LOCATION =
+    String JAXB_NO_NAMESPACE_SCHEMA_LOCATION =
         "jaxb.noNamespaceSchemaLocation";
 
     /**
      * The name of the property used to specify whether or not the marshaller
      * will generate document level events (ie calling startDocument or endDocument).
      */
-    public static final String JAXB_FRAGMENT =
+    String JAXB_FRAGMENT =
         "jaxb.fragment";
 
     /**
@@ -362,7 +362,7 @@
      * @throws IllegalArgumentException
      *      If any of the method parameters are null
      */
-    public void marshal( Object jaxbElement, javax.xml.transform.Result result )
+    void marshal(Object jaxbElement, javax.xml.transform.Result result)
         throws JAXBException;
 
     /**
@@ -384,7 +384,7 @@
      * @throws IllegalArgumentException
      *      If any of the method parameters are null
      */
-    public void marshal( Object jaxbElement, java.io.OutputStream os )
+    void marshal(Object jaxbElement, java.io.OutputStream os)
         throws JAXBException;
 
     /**
@@ -407,7 +407,7 @@
      *      If any of the method parameters are null
      * @since 1.6, JAXB 2.1
      */
-    public void marshal( Object jaxbElement, File output )
+    void marshal(Object jaxbElement, File output)
         throws JAXBException;
 
     /**
@@ -429,7 +429,7 @@
      * @throws IllegalArgumentException
      *      If any of the method parameters are null
      */
-    public void marshal( Object jaxbElement, java.io.Writer writer )
+    void marshal(Object jaxbElement, java.io.Writer writer)
         throws JAXBException;
 
     /**
@@ -451,7 +451,7 @@
      * @throws IllegalArgumentException
      *      If any of the method parameters are null
      */
-    public void marshal( Object jaxbElement, org.xml.sax.ContentHandler handler )
+    void marshal(Object jaxbElement, org.xml.sax.ContentHandler handler)
         throws JAXBException;
 
     /**
@@ -477,7 +477,7 @@
      * @throws IllegalArgumentException
      *      If any of the method parameters are null
      */
-    public void marshal( Object jaxbElement, org.w3c.dom.Node node )
+    void marshal(Object jaxbElement, org.w3c.dom.Node node)
         throws JAXBException;
 
     /**
@@ -501,7 +501,7 @@
      *      If any of the method parameters are null
      * @since 1.6, JAXB 2.0
      */
-    public void marshal( Object jaxbElement, javax.xml.stream.XMLStreamWriter writer )
+    void marshal(Object jaxbElement, javax.xml.stream.XMLStreamWriter writer)
         throws JAXBException;
 
     /**
@@ -525,7 +525,7 @@
      *      If any of the method parameters are null
      * @since 1.6, JAXB 2.0
      */
-    public void marshal( Object jaxbElement, javax.xml.stream.XMLEventWriter writer )
+    void marshal(Object jaxbElement, javax.xml.stream.XMLEventWriter writer)
         throws JAXBException;
 
     /**
@@ -551,7 +551,7 @@
      *      If any unexpected problem occurs
      *
      */
-    public org.w3c.dom.Node getNode( java.lang.Object contentTree )
+    org.w3c.dom.Node getNode(java.lang.Object contentTree)
         throws JAXBException;
 
     /**
@@ -572,7 +572,7 @@
      * @throws IllegalArgumentException
      *      If the name parameter is null
      */
-    public void setProperty( String name, Object value )
+    void setProperty(String name, Object value)
         throws PropertyException;
 
     /**
@@ -592,7 +592,7 @@
      * @throws IllegalArgumentException
      *      If the name parameter is null
      */
-    public Object getProperty( String name ) throws PropertyException;
+    Object getProperty(String name) throws PropertyException;
 
     /**
      * Allow an application to register a validation event handler.
@@ -611,7 +611,7 @@
      * @throws JAXBException if an error was encountered while setting the
      *         event handler
      */
-    public void setEventHandler( ValidationEventHandler handler )
+    void setEventHandler(ValidationEventHandler handler)
         throws JAXBException;
 
     /**
@@ -623,7 +623,7 @@
      * @throws JAXBException if an error was encountered while getting the
      *         current event handler
      */
-    public ValidationEventHandler getEventHandler()
+    ValidationEventHandler getEventHandler()
         throws JAXBException;
 
 
@@ -647,7 +647,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> void setAdapter( A adapter );
+    <A extends XmlAdapter<?, ?>> void setAdapter(A adapter);
 
     /**
      * Associates a configured instance of {@link XmlAdapter} with this marshaller.
@@ -678,7 +678,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> void setAdapter( Class<A> type, A adapter );
+    <A extends XmlAdapter<?, ?>> void setAdapter(Class<A> type, A adapter);
 
     /**
      * Gets the adapter associated with the specified type.
@@ -700,7 +700,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> A getAdapter( Class<A> type );
+    <A extends XmlAdapter<?, ?>> A getAdapter(Class<A> type);
 
 
     /**
@@ -735,7 +735,7 @@
      *         JAXB 1.0 mapped classes
      * @since 1.6, JAXB 2.0
      */
-    public void setSchema( Schema schema );
+    void setSchema(Schema schema);
 
     /**
      * Get the JAXP {@link javax.xml.validation.Schema Schema} object
@@ -750,7 +750,7 @@
      *         JAXB 1.0 mapped classes
      * @since 1.6, JAXB 2.0
      */
-    public Schema getSchema();
+    Schema getSchema();
 
     /**
      * <p>
@@ -771,7 +771,7 @@
      * @see Marshaller#getListener()
      * @since 1.6, JAXB 2.0
      */
-    public static abstract class Listener {
+    abstract class Listener {
 
         /**
          * Do-nothing constructor for the derived classes.
@@ -819,7 +819,7 @@
      * @param listener an instance of a class that implements {@link Listener}
      * @since 1.6, JAXB 2.0
      */
-    public void setListener(Listener listener);
+    void setListener(Listener listener);
 
     /**
      * <p>Return {@link Listener} registered with this {@link Marshaller}.
@@ -828,5 +828,5 @@
      *         if no Listener is registered with this Marshaller.
      * @since 1.6, JAXB 2.0
      */
-    public Listener getListener();
+    Listener getListener();
 }
diff --git a/api/src/main/java/jakarta/xml/bind/Unmarshaller.java b/api/src/main/java/jakarta/xml/bind/Unmarshaller.java
index 52a30cc..a43f0fe 100644
--- a/api/src/main/java/jakarta/xml/bind/Unmarshaller.java
+++ b/api/src/main/java/jakarta/xml/bind/Unmarshaller.java
@@ -408,7 +408,7 @@
      * @throws IllegalArgumentException
      *      If the file parameter is null
      */
-    public Object unmarshal( java.io.File f ) throws JAXBException;
+    Object unmarshal(java.io.File f) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified InputStream and return the
@@ -431,7 +431,7 @@
      * @throws IllegalArgumentException
      *      If the InputStream parameter is null
      */
-    public Object unmarshal( java.io.InputStream is ) throws JAXBException;
+    Object unmarshal(java.io.InputStream is) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified Reader and return the
@@ -456,7 +456,7 @@
      *      If the InputStream parameter is null
      * @since 1.6, JAXB 2.0
      */
-    public Object unmarshal( Reader reader ) throws JAXBException;
+    Object unmarshal(Reader reader) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified URL and return the resulting
@@ -478,7 +478,7 @@
      * @throws IllegalArgumentException
      *      If the URL parameter is null
      */
-    public Object unmarshal( java.net.URL url ) throws JAXBException;
+    Object unmarshal(java.net.URL url) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified SAX InputSource and return the
@@ -500,7 +500,7 @@
      * @throws IllegalArgumentException
      *      If the InputSource parameter is null
      */
-    public Object unmarshal( org.xml.sax.InputSource source ) throws JAXBException;
+    Object unmarshal(org.xml.sax.InputSource source) throws JAXBException;
 
     /**
      * Unmarshal global XML data from the specified DOM tree and return the resulting
@@ -525,7 +525,7 @@
      *      If the Node parameter is null
      * @see #unmarshal(org.w3c.dom.Node, Class)
      */
-    public Object unmarshal( org.w3c.dom.Node node ) throws JAXBException;
+    Object unmarshal(org.w3c.dom.Node node) throws JAXBException;
 
     /**
      * Unmarshal XML data by Jakarta XML Binding mapped {@code declaredType}
@@ -555,7 +555,7 @@
      *      If any parameter is null
      * @since 1.6, JAXB 2.0
      */
-    public <T> JAXBElement<T> unmarshal( org.w3c.dom.Node node, Class<T> declaredType ) throws JAXBException;
+    <T> JAXBElement<T> unmarshal(org.w3c.dom.Node node, Class<T> declaredType) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified XML Source and return the
@@ -613,7 +613,7 @@
      *      If the Source parameter is null
      * @see #unmarshal(javax.xml.transform.Source, Class)
      */
-    public Object unmarshal( javax.xml.transform.Source source )
+    Object unmarshal(javax.xml.transform.Source source)
         throws JAXBException;
 
 
@@ -647,7 +647,7 @@
      *      If any parameter is null
      * @since 1.6, JAXB 2.0
      */
-    public <T> JAXBElement<T> unmarshal( javax.xml.transform.Source source, Class<T> declaredType )
+    <T> JAXBElement<T> unmarshal(javax.xml.transform.Source source, Class<T> declaredType)
         throws JAXBException;
 
     /**
@@ -684,7 +684,7 @@
      * @since 1.6, JAXB 2.0
      * @see #unmarshal(javax.xml.stream.XMLStreamReader, Class)
      */
-    public Object unmarshal( javax.xml.stream.XMLStreamReader reader )
+    Object unmarshal(javax.xml.stream.XMLStreamReader reader)
         throws JAXBException;
 
     /**
@@ -720,7 +720,7 @@
      *      If any parameter is null
      * @since 1.6, JAXB 2.0
      */
-    public <T> JAXBElement<T> unmarshal( javax.xml.stream.XMLStreamReader reader, Class<T> declaredType ) throws JAXBException;
+    <T> JAXBElement<T> unmarshal(javax.xml.stream.XMLStreamReader reader, Class<T> declaredType) throws JAXBException;
 
     /**
      * Unmarshal XML data from the specified pull parser and return the
@@ -756,7 +756,7 @@
      * @since 1.6, JAXB 2.0
      * @see #unmarshal(javax.xml.stream.XMLEventReader, Class)
      */
-    public Object unmarshal( javax.xml.stream.XMLEventReader reader )
+    Object unmarshal(javax.xml.stream.XMLEventReader reader)
         throws JAXBException;
 
     /**
@@ -793,7 +793,7 @@
      *      If any parameter is null
      * @since 1.6, JAXB 2.0
      */
-    public <T> JAXBElement<T> unmarshal( javax.xml.stream.XMLEventReader reader, Class<T> declaredType ) throws JAXBException;
+    <T> JAXBElement<T> unmarshal(javax.xml.stream.XMLEventReader reader, Class<T> declaredType) throws JAXBException;
 
     /**
      * Get an unmarshaller handler object that can be used as a component in
@@ -809,7 +809,7 @@
      * @return the unmarshaller handler object
      * @see UnmarshallerHandler
      */
-    public UnmarshallerHandler getUnmarshallerHandler();
+    UnmarshallerHandler getUnmarshallerHandler();
 
     /**
      * Allow an application to register a {@code ValidationEventHandler}.
@@ -829,7 +829,7 @@
      * @throws JAXBException if an error was encountered while setting the
      *         event handler
      */
-    public void setEventHandler( ValidationEventHandler handler )
+    void setEventHandler(ValidationEventHandler handler)
         throws JAXBException;
 
     /**
@@ -841,7 +841,7 @@
      * @throws JAXBException if an error was encountered while getting the
      *         current event handler
      */
-    public ValidationEventHandler getEventHandler()
+    ValidationEventHandler getEventHandler()
         throws JAXBException;
 
     /**
@@ -862,7 +862,7 @@
      * @throws IllegalArgumentException
      *      If the name parameter is null
      */
-    public void setProperty( String name, Object value )
+    void setProperty(String name, Object value)
         throws PropertyException;
 
     /**
@@ -882,7 +882,7 @@
      * @throws IllegalArgumentException
      *      If the name parameter is null
      */
-    public Object getProperty( String name ) throws PropertyException;
+    Object getProperty(String name) throws PropertyException;
 
     /**
      * Specify the JAXP {@link javax.xml.validation.Schema Schema}
@@ -898,7 +898,7 @@
      *         JAXB 1.0 mapped classes
      * @since 1.6, JAXB 2.0
      */
-    public void setSchema( Schema schema );
+    void setSchema(Schema schema);
 
     /**
      * Get the JAXP {@link javax.xml.validation.Schema Schema} object
@@ -913,7 +913,7 @@
      *         JAXB 1.0 mapped classes
      * @since 1.6, JAXB 2.0
      */
-    public Schema getSchema();
+    Schema getSchema();
 
     /**
      * Associates a configured instance of {@link XmlAdapter} with this unmarshaller.
@@ -932,7 +932,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> void setAdapter( A adapter );
+    <A extends XmlAdapter<?, ?>> void setAdapter(A adapter);
 
     /**
      * Associates a configured instance of {@link XmlAdapter} with this unmarshaller.
@@ -964,7 +964,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> void setAdapter( Class<A> type, A adapter );
+    <A extends XmlAdapter<?, ?>> void setAdapter(Class<A> type, A adapter);
 
     /**
      * Gets the adapter associated with the specified type.
@@ -987,7 +987,7 @@
      *      if invoked agains a JAXB 1.0 implementation.
      * @since 1.6, JAXB 2.0
      */
-    public <A extends XmlAdapter<?, ?>> A getAdapter( Class<A> type );
+    <A extends XmlAdapter<?, ?>> A getAdapter(Class<A> type);
 
     /**
      * Associate a context that resolves cid's, content-id URIs, to
@@ -1025,7 +1025,7 @@
      *
      * @since 1.6, JAXB 2.0
      */
-    public static abstract class Listener {
+    abstract class Listener {
 
         /**
          * Do-nothing constructor for the derived classes.
@@ -1080,7 +1080,7 @@
      * @param listener  provides unmarshal event callbacks for this {@link Unmarshaller}
      * @since 1.6, JAXB 2.0
      */
-    public void     setListener(Listener listener);
+    void     setListener(Listener listener);
 
     /**
      * <p>Return {@link Listener} registered with this {@link Unmarshaller}.
@@ -1089,5 +1089,5 @@
      *         if no Listener is registered with this Unmarshaller.
      * @since 1.6, JAXB 2.0
      */
-    public Listener getListener();
+    Listener getListener();
 }
diff --git a/api/src/main/java/jakarta/xml/bind/ValidationEvent.java b/api/src/main/java/jakarta/xml/bind/ValidationEvent.java
index 8c23fed..6a231f9 100644
--- a/api/src/main/java/jakarta/xml/bind/ValidationEvent.java
+++ b/api/src/main/java/jakarta/xml/bind/ValidationEvent.java
@@ -26,19 +26,19 @@
      * Conditions that are not errors or fatal errors as defined by the 
      * XML 1.0 recommendation 
      */
-    public static final int WARNING     = 0;
+    int WARNING     = 0;
     
     /**
      * Conditions that correspond to the definition of "error" in section 
      * 1.2 of the W3C XML 1.0 Recommendation
      */
-    public static final int ERROR       = 1;
+    int ERROR       = 1;
     
     /**
      * Conditions that correspond to the definition of "fatal error" in section 
      * 1.2 of the W3C XML 1.0 Recommendation
      */
-    public static final int FATAL_ERROR = 2;
+    int FATAL_ERROR = 2;
 
     /**
      * Retrieve the severity code for this warning/error. 
@@ -49,14 +49,14 @@
      *
      * @return the severity code for this warning/error
      */
-    public int getSeverity();
+    int getSeverity();
     
     /**
      * Retrieve the text message for this warning/error.
      *
      * @return the text message for this warning/error or null if one wasn't set
      */
-    public String getMessage();
+    String getMessage();
     
     /**
      * Retrieve the linked exception for this warning/error.
@@ -64,13 +64,13 @@
      * @return the linked exception for this warning/error or null if one
      *         wasn't set
      */
-    public Throwable getLinkedException();
+    Throwable getLinkedException();
     
     /**
      * Retrieve the locator for this warning/error.
      *
      * @return the locator that indicates where the warning/error occurred
      */
-    public ValidationEventLocator getLocator();
+    ValidationEventLocator getLocator();
     
 }
diff --git a/api/src/main/java/jakarta/xml/bind/ValidationEventHandler.java b/api/src/main/java/jakarta/xml/bind/ValidationEventHandler.java
index 3f172eb..814ad27 100644
--- a/api/src/main/java/jakarta/xml/bind/ValidationEventHandler.java
+++ b/api/src/main/java/jakarta/xml/bind/ValidationEventHandler.java
@@ -80,7 +80,7 @@
      *         {@code ValidationException}, or {@code MarshalException}.
      * @throws IllegalArgumentException if the event object is null.
      */
-    public boolean handleEvent( ValidationEvent event );
+    boolean handleEvent(ValidationEvent event);
     
 }
 
diff --git a/api/src/main/java/jakarta/xml/bind/ValidationEventLocator.java b/api/src/main/java/jakarta/xml/bind/ValidationEventLocator.java
index e9f64e7..5841ad1 100644
--- a/api/src/main/java/jakarta/xml/bind/ValidationEventLocator.java
+++ b/api/src/main/java/jakarta/xml/bind/ValidationEventLocator.java
@@ -35,28 +35,28 @@
      *
      * @return the name of the XML source as a URL or null if unavailable
      */
-    public java.net.URL getURL();
+    java.net.URL getURL();
     
     /**
      * Return the byte offset if available
      *
      * @return the byte offset into the input source or -1 if unavailable
      */
-    public int getOffset();
+    int getOffset();
     
     /**
      * Return the line number if available
      *
      * @return the line number or -1 if unavailable 
      */
-    public int getLineNumber();
+    int getLineNumber();
     
     /**
      * Return the column number if available
      *
      * @return the column number or -1 if unavailable
      */
-    public int getColumnNumber();
+    int getColumnNumber();
     
     /**
      * Return a reference to the object in the Java content tree if available
@@ -64,13 +64,13 @@
      * @return a reference to the object in the Java content tree or null if
      *         unavailable
      */
-    public java.lang.Object getObject();
+    java.lang.Object getObject();
     
     /**
      * Return a reference to the DOM Node if available
      *
      * @return a reference to the DOM Node or null if unavailable 
      */
-    public org.w3c.dom.Node getNode();
+    org.w3c.dom.Node getNode();
     
 }
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlElement.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlElement.java
index 9ba982f..02f2ce9 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlElement.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlElement.java
@@ -189,7 +189,7 @@
      * signal that the type be inferred from the signature
      * of the property.
      */
-    static final class DEFAULT {
+    final class DEFAULT {
         private DEFAULT() {}
     }
 }
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlElementDecl.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlElementDecl.java
index b3b4da0..6ddebfc 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlElementDecl.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlElementDecl.java
@@ -198,7 +198,7 @@
      * Used in {@link XmlElementDecl#scope()} to
      * signal that the declaration is in the global scope.
      */
-    public final class GLOBAL {
+    final class GLOBAL {
         private GLOBAL() {}
     }
 }
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlElementRef.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlElementRef.java
index db284bd..f6d1595 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlElementRef.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlElementRef.java
@@ -250,7 +250,7 @@
      * signal that the type be inferred from the signature
      * of the property.
      */
-    static final class DEFAULT {
+    final class DEFAULT {
         private DEFAULT() {}
     }
 
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlSchema.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlSchema.java
index 95d0fd4..f598fcf 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlSchema.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlSchema.java
@@ -190,5 +190,5 @@
      */
     // the actual value is chosen because ## is not a valid
     // sequence in xs:anyURI.
-    static final String NO_LOCATION = "##generate";
+    String NO_LOCATION = "##generate";
 }
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlSchemaType.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlSchemaType.java
index 1fb1b34..5e26737 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlSchemaType.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlSchemaType.java
@@ -89,7 +89,7 @@
      * of the property.
      */
 
-    static final class DEFAULT {
+    final class DEFAULT {
         private DEFAULT() {};
     }
 
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/XmlType.java b/api/src/main/java/jakarta/xml/bind/annotation/XmlType.java
index 5d154aa..d705da6 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/XmlType.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/XmlType.java
@@ -431,7 +431,7 @@
      * signal that either factory mehod is not used or
      * that it's in the class with this {@link XmlType} itself.
      */
-    static final class DEFAULT {
+    final class DEFAULT {
         private DEFAULT() {}
     }
 
diff --git a/api/src/main/java/jakarta/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java b/api/src/main/java/jakarta/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
index 50a3e08..2d51d55 100644
--- a/api/src/main/java/jakarta/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
+++ b/api/src/main/java/jakarta/xml/bind/annotation/adapters/XmlJavaTypeAdapter.java
@@ -97,7 +97,7 @@
      * of the field, property, parameter or the class.
      */
 
-    static final class DEFAULT {
+    final class DEFAULT {
         private DEFAULT() {}
     }
 
diff --git a/spec/src/main/asciidoc/ch04-binding_framework.adoc b/spec/src/main/asciidoc/ch04-binding_framework.adoc
index 65e15b0..be6ddb7 100644
--- a/spec/src/main/asciidoc/ch04-binding_framework.adoc
+++ b/spec/src/main/asciidoc/ch04-binding_framework.adoc
@@ -477,11 +477,11 @@
 [source,java]
 ----
 interface Marshaller {
-    static final string JAXB_ENCODING;
-    static final string JAXB_FORMATTED_OUTPUT;
-    static final string JAXB_SCHEMA_LOCATION;
-    static final string JAXB_NO_NAMESPACE_SCHEMA_LOCATION;
-    static final string JAXB_FRAGMENT;
+    string JAXB_ENCODING;
+    string JAXB_FORMATTED_OUTPUT;
+    string JAXB_SCHEMA_LOCATION;
+    string JAXB_NO_NAMESPACE_SCHEMA_LOCATION;
+    string JAXB_FRAGMENT;
 
     <PROTENTIALLY MORE PROPERTIES...>
 
diff --git a/spec/src/main/asciidoc/ch08-java_types.adoc b/spec/src/main/asciidoc/ch08-java_types.adoc
index c9316ef..5dc6d03 100644
--- a/spec/src/main/asciidoc/ch08-java_types.adoc
+++ b/spec/src/main/asciidoc/ch08-java_types.adoc
@@ -701,7 +701,7 @@
     String name();
     String namespace() default "http://www.w3.org/2001/XMLSchema";
     Class type() default DEFAULT.class;
-    static final class DEFAULT {}
+    final class DEFAULT {}
 }
 ----
 
@@ -838,7 +838,7 @@
     String[] propOrder() default {""};
     String namespace() default "##default";
     Class factoryClass() default DEFAULT.class;
-    static final class DEFAULT {};
+    final class DEFAULT {};
     String factoryMethod() default "";
 }
 ----
@@ -1264,7 +1264,7 @@
     String namespace() default "##default";
     String[] propOrder() default {""};
     Class factoryClass() default DEFAULT.class;
-    static final class DEFAULT {};
+    final class DEFAULT {};
     String factoryMethod() default "";
 }
 ----
@@ -2488,7 +2488,7 @@
 
     //XML local name of a substitution group's head element.
     String substitutionHeadName() default "";
-    public final class GLOBAL {}
+    final class GLOBAL {}
 }
 ----
 
@@ -2593,7 +2593,7 @@
 public @interface XmlJavaTypeAdapter {
     Class<? extends XmlAdapter> value();
     Class type() default DEFAULT.class;
-    static final class DEFAULT {}
+    final class DEFAULT {}
 }
 ----
 
