--- a/modules/javafx.graphics/src/main/java/javafx/scene/AmbientLight.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/AmbientLight.java
@@ -41,7 +41,7 @@
  *
  * @since JavaFX 8.0
  */
-public class AmbientLight extends LightBase {
+public non-sealed class AmbientLight extends LightBase {
     static {
         AmbientLightHelper.setAmbientLightAccessor(new AmbientLightHelper.AmbientLightAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/Camera.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/Camera.java
@@ -101,14 +101,9 @@
  * coordinate space. Hence the conversion formula mentioned above is not used.
  * </p>
  *
- * <p>
- * An application should not extend the Camera class directly. Doing so may lead to
- * an UnsupportedOperationException being thrown.
- * </p>
- *
  * @since JavaFX 2.0
  */
-public abstract class Camera extends Node {
+public abstract sealed class Camera extends Node permits ParallelCamera, PerspectiveCamera {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/DirectionalLight.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/DirectionalLight.java
@@ -48,7 +48,7 @@
  * @since 18
  * @see PhongMaterial
  */
-public class DirectionalLight extends LightBase {
+public non-sealed class DirectionalLight extends LightBase {
     static {
         DirectionalLightHelper.setDirectionalLightAccessor(new DirectionalLightHelper.DirectionalLightAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/LightBase.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/LightBase.java
@@ -97,9 +97,6 @@
  * * Supports spotlight attenuation factors as described in its class docs.
  *
  * <p>
- * An application cannot add its own light types. Extending {@code LightBase} directly may lead to an
- * {@code UnsupportedOperationException} being thrown.
- * <p>
  * All light types are not affected by scaling and shearing transforms.
  *
  * <h2><a id="Color">Color</a></h2>
@@ -166,7 +163,7 @@
  *
  * @since JavaFX 8.0
  */
-public abstract class LightBase extends Node {
+public abstract sealed class LightBase extends Node permits AmbientLight, DirectionalLight, PointLight {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/Node.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/Node.java
@@ -227,11 +231,6 @@
  * the {@link Platform#startup(Runnable)} method for more information.
  * </p>
  *
- * <p>
- * An application should not extend the Node class directly. Doing so may lead to
- * an UnsupportedOperationException being thrown.
- * </p>
- *
  * <h2><a id="StringID">String ID</a></h2>
  * <p>
  * Each node in the scene graph can be given a unique {@link #idProperty id}. This id is
@@ -412,7 +411,9 @@
  * @since JavaFX 2.0
  */
 @IDProperty("id")
-public abstract class Node implements EventTarget, Styleable {
+public abstract sealed class Node
+        implements EventTarget, Styleable
+        permits AbstractNode, Camera, LightBase, Parent, SubScene, Canvas, ImageView, Shape, Shape3D {
 
     /*
      * Store the singleton instance of the NodeHelper subclass corresponding


--- a/modules/javafx.graphics/src/main/java/javafx/scene/ParallelCamera.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/ParallelCamera.java
@@ -47,7 +47,7 @@
  *
  * @since JavaFX 2.0
  */
-public class ParallelCamera extends Camera {
+public non-sealed class ParallelCamera extends Camera {
     static {
         ParallelCameraHelper.setParallelCameraAccessor(new ParallelCameraHelper.ParallelCameraAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/Parent.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/Parent.java
@@ -76,7 +76,7 @@
  *
  * @since JavaFX 2.0
  */
-public abstract class Parent extends Node {
+public abstract non-sealed class Parent extends Node {
     // package private for testing
     static final int DIRTY_CHILDREN_THRESHOLD = 10;


--- a/modules/javafx.graphics/src/main/java/javafx/scene/PerspectiveCamera.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/PerspectiveCamera.java
@@ -86,7 +86,7 @@
  *
  * @since JavaFX 2.0
  */
-public class PerspectiveCamera extends Camera {
+public non-sealed class PerspectiveCamera extends Camera {
 
     private boolean fixedEyeAtCameraZero = false;


--- a/modules/javafx.graphics/src/main/java/javafx/scene/PointLight.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/PointLight.java
@@ -46,7 +46,7 @@
  * @since JavaFX 8.0
  * @see PhongMaterial
  */
-public class PointLight extends LightBase {
+public non-sealed class PointLight extends LightBase {
     static {
         PointLightHelper.setPointLightAccessor(new PointLightHelper.PointLightAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/SubScene.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/SubScene.java
@@ -100,7 +100,7 @@
  *
  * @since JavaFX 8.0
  */
-public class SubScene extends Node {
+public non-sealed class SubScene extends Node {
     static {
         // This is used by classes in different packages to get access to
         // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/canvas/Canvas.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/canvas/Canvas.java
@@ -71,7 +71,7 @@
  * @see GraphicsContext
  * @since JavaFX 2.2
  */
-public class Canvas extends Node {
+public non-sealed class Canvas extends Node {
     static {
         CanvasHelper.setCanvasAccessor(new CanvasHelper.CanvasAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/image/ImageView.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/image/ImageView.java
@@ -144,7 +144,7 @@
  * @since JavaFX 2.0
  */
 @DefaultProperty("image")
-public class ImageView extends Node {
+public non-sealed class ImageView extends Node {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Arc.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Arc.java
@@ -63,7 +63,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class Arc extends Shape {
+public non-sealed class Arc extends Shape {
     static {
         ArcHelper.setArcAccessor(new ArcHelper.ArcAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Box.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Box.java
@@ -49,7 +49,7 @@
  *
  * @since JavaFX 8.0
  */
-public class Box extends Shape3D {
+public non-sealed class Box extends Shape3D {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Circle.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Circle.java
@@ -58,7 +58,7 @@
 }</pre>
  * @since JavaFX 2.0
  */
-public class Circle extends Shape {
+public non-sealed class Circle extends Shape {
     static {
         CircleHelper.setCircleAccessor(new CircleHelper.CircleAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/CubicCurve.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/CubicCurve.java
@@ -61,7 +61,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class CubicCurve extends Shape {
+public non-sealed class CubicCurve extends Shape {
     static {
         CubicCurveHelper.setCubicCurveAccessor(new CubicCurveHelper.CubicCurveAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Cylinder.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Cylinder.java
@@ -51,7 +51,7 @@
  *
  * @since JavaFX 8.0
  */
-public class Cylinder extends Shape3D {
+public non-sealed class Cylinder extends Shape3D {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Ellipse.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Ellipse.java
@@ -56,7 +56,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class Ellipse extends Shape {
+public non-sealed class Ellipse extends Shape {
     static {
         EllipseHelper.setEllipseAccessor(new EllipseHelper.EllipseAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Line.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Line.java
@@ -58,7 +58,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class Line extends Shape {
+public non-sealed class Line extends Shape {
     static {
         LineHelper.setLineAccessor(new LineHelper.LineAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/MeshView.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/MeshView.java
@@ -47,7 +47,7 @@
  *
  * @since JavaFX 8.0
  */
-public class MeshView extends Shape3D {
+public non-sealed class MeshView extends Shape3D {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Path.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Path.java
@@ -91,7 +91,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class Path extends Shape {
+public non-sealed class Path extends Shape {
     static {
         PathHelper.setPathAccessor(new PathHelper.PathAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Polygon.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Polygon.java
@@ -57,7 +57,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public  class Polygon extends Shape {
+public non-sealed class Polygon extends Shape {
     static {
         PolygonHelper.setPolygonAccessor(new PolygonHelper.PolygonAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Polyline.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Polyline.java
@@ -59,7 +59,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public  class Polyline extends Shape {
+public non-sealed class Polyline extends Shape {
     static {
         PolylineHelper.setPolylineAccessor(new PolylineHelper.PolylineAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/QuadCurve.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/QuadCurve.java
@@ -58,7 +58,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public  class QuadCurve extends Shape {
+public non-sealed class QuadCurve extends Shape {
     static {
         QuadCurveHelper.setQuadCurveAccessor(new QuadCurveHelper.QuadCurveAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Rectangle.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Rectangle.java
@@ -73,7 +73,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public  class Rectangle extends Shape {
+public non-sealed class Rectangle extends Shape {
     static {
         RectangleHelper.setRectangleAccessor(new RectangleHelper.RectangleAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/SVGPath.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/SVGPath.java
@@ -53,7 +53,7 @@
 </PRE>
  * @since JavaFX 2.0
  */
-public class SVGPath extends Shape {
+public non-sealed class SVGPath extends Shape {
     static {
         SVGPathHelper.setSVGPathAccessor(new SVGPathHelper.SVGPathAccessor() {
             @Override


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Shape.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Shape.java
@@ -87,11 +89,6 @@
  * </ul>
  * </ul>
  *
- * <p>
- * An application should not extend the Shape class directly. Doing so may lead to
- * an UnsupportedOperationException being thrown.
- * </p>
- *
  * <h2>Interaction with coordinate systems</h2>
  * Most nodes tend to have only integer translations applied to them and
  * quite often they are defined using integer coordinates as well.  For
@@ -120,7 +117,9 @@
  * the shape.
  * @since JavaFX 2.0
  */
-public abstract class Shape extends Node {
+public abstract sealed class Shape extends Node
+        permits AbstractShape, Arc, Circle, CubicCurve, Ellipse, Line, Path, Polygon,
+                Polyline, QuadCurve, Rectangle, SVGPath, Text {
 
     static {
         // This is used by classes in different packages to get access to


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Shape3D.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Shape3D.java
@@ -60,14 +60,9 @@
  * {@link javafx.application.ConditionalFeature#SCENE3D ConditionalFeature.SCENE3D}
  * for more information.
  *
- * <p>
- * An application should not extend the Shape3D class directly. Doing so may lead to
- * an UnsupportedOperationException being thrown.
- * </p>
- *
  * @since JavaFX 8.0
  */
-public abstract class Shape3D extends Node {
+public abstract sealed class Shape3D extends Node permits Box, Cylinder, MeshView, Sphere {
     static {
         // This is used by classes in different packages to get access to
         // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/shape/Sphere.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/shape/Sphere.java
@@ -51,7 +51,7 @@
  *
  * @since JavaFX 8.0
  */
-public class Sphere extends Shape3D {
+public non-sealed class Sphere extends Shape3D {
     static {
          // This is used by classes in different packages to get access to
          // private and package private methods.


--- a/modules/javafx.graphics/src/main/java/javafx/scene/text/Text.java
+++ b/modules/javafx.graphics/src/main/java/javafx/scene/text/Text.java
@@ -126,7 +126,7 @@
  * @since JavaFX 2.0
  */
 @DefaultProperty("text")
-public class Text extends Shape {
+public non-sealed class Text extends Shape {
     static {
         TextHelper.setTextAccessor(new TextHelper.TextAccessor() {
             @Override