diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
index c5f46fd..95a6ea2 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/ExampleWindowInitializer.kt
@@ -34,6 +34,8 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LEFT_TO_RIGHT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitAttributesCalculatorParams
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitController.SplitSupportStatus.Companion.SPLIT_AVAILABLE
@@ -76,7 +78,7 @@
         val config = params.parentConfiguration
         // The SplitAttributes to occupy the whole task bounds
         val expandContainersAttrs = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .setSplitType(SplitAttributes.SplitType.SPLIT_TYPE_EXPAND)
             .build()
         val tag = params.splitRuleTag
         val shouldReversed = tag?.contains(SUFFIX_REVERSED) ?: false
@@ -104,7 +106,7 @@
             TAG_SHOW_FULLSCREEN_IN_PORTRAIT + SUFFIX_AND_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
                 if (isTabletop) {
                     return SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setSplitType(SPLIT_TYPE_HINGE)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -121,7 +123,7 @@
             TAG_SHOW_HORIZONTAL_LAYOUT_IN_TABLETOP -> {
                 if (isTabletop) {
                     return SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                        .setSplitType(SPLIT_TYPE_HINGE)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -135,7 +137,7 @@
             }
             TAG_SHOW_DIFFERENT_LAYOUT_WITH_SIZE -> {
                 return SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setSplitType(SPLIT_TYPE_HINGE)
                     .setLayoutDirection(
                         if (shouldReversed) {
                             BOTTOM_TO_TOP
@@ -149,7 +151,7 @@
                     expandContainersAttrs
                 } else if (config.screenWidthDp <= 600) {
                     SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setSplitType(SPLIT_TYPE_EQUAL)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 BOTTOM_TO_TOP
@@ -161,7 +163,7 @@
                         .build()
                 } else {
                     SplitAttributes.Builder()
-                        .setSplitType(SplitAttributes.SplitType.splitEqually())
+                        .setSplitType(SPLIT_TYPE_EQUAL)
                         .setLayoutDirection(
                             if (shouldReversed) {
                                 RIGHT_TO_LEFT
@@ -179,7 +181,7 @@
                     return SplitAttributes.Builder()
                         .setSplitType(
                             if (foldingState.isSeparating) {
-                                SplitAttributes.SplitType.splitByHinge()
+                                SPLIT_TYPE_HINGE
                             } else {
                                 SplitAttributes.SplitType.ratio(0.3f)
                             }
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
index d035865..680d8d2 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitDeviceStateActivityBase.kt
@@ -36,6 +36,8 @@
 import androidx.window.embedding.EmbeddingRule
 import androidx.window.embedding.RuleController
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitController.SplitSupportStatus.Companion.SPLIT_AVAILABLE
 import androidx.window.embedding.SplitInfo
@@ -262,7 +264,7 @@
         )
         splitPairFilters.add(splitPairFilter)
         val defaultSplitAttributes = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitEqually())
+            .setSplitType(SPLIT_TYPE_EQUAL)
             .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
             .setAnimationBackgroundColor(demoActivityEmbeddingController.animationBackgroundColor)
             .build()
@@ -309,7 +311,7 @@
 
     private suspend fun updateSplitAttributesText(newSplitInfos: List<SplitInfo>) {
         var splitAttributes: SplitAttributes = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.expandContainers())
+            .setSplitType(SPLIT_TYPE_EXPAND)
             .build()
         var suggestToFinishItself = false
         val isCallbackSupported = splitController.isSplitAttributesCalculatorSupported()
@@ -318,8 +320,7 @@
             if (info.contains(this@SplitDeviceStateActivityBase)) {
                 splitAttributes = info.splitAttributes
                 if (componentName == activityB &&
-                    splitAttributes.splitType
-                        is SplitAttributes.SplitType.ExpandContainersSplitType
+                    splitAttributes.splitType == SPLIT_TYPE_EXPAND
                 ) {
                     // We don't put any functionality on activity B. Suggest users to finish the
                     // activity if it fills the host task.
diff --git a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
index 370951f..4ab221f 100644
--- a/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
+++ b/window/window-demos/demo/src/main/java/androidx/window/demo/embedding/SplitPipActivityBase.kt
@@ -35,6 +35,7 @@
 import androidx.window.embedding.EmbeddingRule
 import androidx.window.embedding.RuleController
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
 import androidx.window.embedding.SplitController
 import androidx.window.embedding.SplitPairFilter
 import androidx.window.embedding.SplitPairRule
@@ -109,8 +110,7 @@
                         var isInSplit = false
                         for (info in newSplitInfos) {
                             if (info.contains(this@SplitPipActivityBase) &&
-                                info.splitAttributes.splitType !is
-                                    SplitAttributes.SplitType.ExpandContainersSplitType
+                                info.splitAttributes.splitType == SPLIT_TYPE_EXPAND
                             ) {
                                 isInSplit = true
                                 break
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
index 37fc296..ade64a2 100644
--- a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingJavaTest.java
@@ -16,6 +16,8 @@
 
 package androidx.window.testing.emedding;
 
+import static androidx.window.embedding.SplitAttributes.SplitType.SPLIT_TYPE_HINGE;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
@@ -52,8 +54,7 @@
     private static final SplitAttributes DEFAULT_SPLIT_ATTRIBUTES =
             new SplitAttributes.Builder().build();
     private static final SplitAttributes TABLETOP_HINGE_ATTRIBUTES = new SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitByHinge(
-                    SplitAttributes.SplitType.splitEqually()))
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
             .build();
 
@@ -114,7 +115,7 @@
             return params.getDefaultSplitAttributes();
         } else {
             return new SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SplitAttributes.SplitType.SPLIT_TYPE_EXPAND)
                     .build();
         }
     }
diff --git a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
index 15f0193a..0eb2411 100644
--- a/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
+++ b/window/window-testing/src/androidTest/java/androidx/window/testing/emedding/SplitAttributesCalculatorParamsTestingTest.kt
@@ -21,6 +21,8 @@
 import android.graphics.Rect
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
 import androidx.window.embedding.SplitAttributesCalculatorParams
 import androidx.window.layout.FoldingFeature
 import androidx.window.layout.WindowLayoutInfo
@@ -91,7 +93,7 @@
             params.defaultSplitAttributes
         } else {
             SplitAttributes.Builder()
-                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .setSplitType(SPLIT_TYPE_EXPAND)
                 .build()
         }
     }
@@ -101,7 +103,7 @@
         private val TEST_METRICS = WindowMetrics(TEST_BOUNDS)
         private val DEFAULT_SPLIT_ATTRIBUTES = SplitAttributes.Builder().build()
         private val TABLETOP_HINGE_ATTRIBUTES = SplitAttributes.Builder()
-            .setSplitType(SplitAttributes.SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
             .build()
     }
diff --git a/window/window/api/current.txt b/window/window/api/current.txt
index f514e31..a7806dc 100644
--- a/window/window/api/current.txt
+++ b/window/window/api/current.txt
@@ -126,32 +126,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   public final class SplitController {
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 80d1b6b..01b7d59 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -167,32 +167,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   @androidx.window.core.ExperimentalWindowApi public final class SplitAttributesCalculatorParams {
diff --git a/window/window/api/restricted_current.txt b/window/window/api/restricted_current.txt
index f514e31..a7806dc 100644
--- a/window/window/api/restricted_current.txt
+++ b/window/window/api/restricted_current.txt
@@ -126,32 +126,16 @@
   public static final class SplitAttributes.LayoutDirection.Companion {
   }
 
-  public static class SplitAttributes.SplitType {
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public static final androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
+  public static final class SplitAttributes.SplitType {
+    method public static androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
     field public static final androidx.window.embedding.SplitAttributes.SplitType.Companion Companion;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EQUAL;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_EXPAND;
+    field public static final androidx.window.embedding.SplitAttributes.SplitType SPLIT_TYPE_HINGE;
   }
 
   public static final class SplitAttributes.SplitType.Companion {
-    method public androidx.window.embedding.SplitAttributes.SplitType.ExpandContainersSplitType expandContainers();
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
-    method public androidx.window.embedding.SplitAttributes.SplitType.HingeSplitType splitByHinge(optional androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType);
-    method public androidx.window.embedding.SplitAttributes.SplitType.RatioSplitType splitEqually();
-  }
-
-  public static final class SplitAttributes.SplitType.ExpandContainersSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-  }
-
-  public static final class SplitAttributes.SplitType.HingeSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public androidx.window.embedding.SplitAttributes.SplitType getFallbackSplitType();
-    property public final androidx.window.embedding.SplitAttributes.SplitType fallbackSplitType;
-  }
-
-  public static final class SplitAttributes.SplitType.RatioSplitType extends androidx.window.embedding.SplitAttributes.SplitType {
-    method public float getRatio();
-    property public final float ratio;
+    method public androidx.window.embedding.SplitAttributes.SplitType ratio(@FloatRange(from=0.0, to=1.0, fromInclusive=false, toInclusive=false) float ratio);
   }
 
   public final class SplitController {
diff --git a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
index 2cba736..9e69205 100644
--- a/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
+++ b/window/window/samples/src/main/java/androidx.window.samples.embedding/SplitAttributesCalculatorSamples.kt
@@ -21,6 +21,9 @@
 import androidx.annotation.Sampled
 import androidx.window.core.ExperimentalWindowApi
 import androidx.window.embedding.SplitAttributes
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import androidx.window.embedding.SplitController
 import androidx.window.layout.FoldingFeature
 
@@ -50,7 +53,7 @@
                 // Split the parent container that followed by the hinge if the hinge separates the
                 // parent window.
                 return@setSplitAttributesCalculator SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitByHinge())
+                    .setSplitType(SPLIT_TYPE_HINGE)
                     .setLayoutDirection(
                         if (foldingState.orientation == FoldingFeature.Orientation.HORIZONTAL) {
                             SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
@@ -67,14 +70,14 @@
             ) {
                 // Split the parent container equally and vertically if the device is in landscape.
                 SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.splitEqually())
+                    .setSplitType(SPLIT_TYPE_EQUAL)
                     .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                     .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GRAY))
                     .build()
             } else {
                 // Expand containers if the device is in portrait or the width is less than 600 dp.
                 SplitAttributes.Builder()
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SPLIT_TYPE_EXPAND)
                     .build()
             }
         }
@@ -104,7 +107,7 @@
             } else {
                 // Fallback to expand the secondary container
                 builder
-                    .setSplitType(SplitAttributes.SplitType.expandContainers())
+                    .setSplitType(SPLIT_TYPE_EXPAND)
                     .build()
             }
         }
@@ -122,7 +125,7 @@
             val areDefaultConstraintsSatisfied = params.areDefaultConstraintsSatisfied
 
             val expandContainersAttrs = SplitAttributes.Builder()
-                .setSplitType(SplitAttributes.SplitType.expandContainers())
+                .setSplitType(SPLIT_TYPE_EXPAND)
                 .build()
             if (!areDefaultConstraintsSatisfied) {
                 return@setSplitAttributesCalculator expandContainersAttrs
@@ -130,7 +133,7 @@
             // Always expand containers for the splitRule tagged as
             // TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT if the device is in portrait
             // even if [areDefaultConstraintsSatisfied] reports true.
-            if (bounds.height() > bounds.width() && TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT.equals(tag)) {
+            if (bounds.height() > bounds.width() && TAG_SPLIT_RULE_EXPAND_IN_PORTRAIT == tag) {
                 return@setSplitAttributesCalculator expandContainersAttrs
             }
             // Otherwise, use the default splitAttributes.
@@ -138,6 +141,22 @@
         }
 }
 
+@OptIn(ExperimentalWindowApi::class)
+@Sampled
+fun fallbackToExpandContainersForSplitTypeHinge() {
+    SplitController.getInstance(context).setSplitAttributesCalculator { params ->
+        SplitAttributes.Builder()
+            .setSplitType(
+                if (params.parentWindowLayoutInfo.displayFeatures
+                        .filterIsInstance<FoldingFeature>().isNotEmpty()) {
+                    SPLIT_TYPE_HINGE
+                } else {
+                    SPLIT_TYPE_EXPAND
+                }
+            ).build()
+    }
+}
+
 /** Assume it's a valid [Application]... */
 val context = Application()
 const val TAG_SPLIT_RULE_MAIN = "main"
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
index 0ce0920..631dfc3 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/EmbeddingAdapterTest.kt
@@ -25,8 +25,10 @@
 import androidx.window.core.ExtensionsUtil
 import androidx.window.core.PredicateAdapter
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
 import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.embedding.SplitAttributes.LayoutDirection.TOP_TO_BOTTOM
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
 import com.nhaarman.mockitokotlin2.mock
 import com.nhaarman.mockitokotlin2.whenever
 import org.junit.Assert.assertEquals
@@ -57,7 +59,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.splitEqually())
+                .setSplitType(SplitType.SPLIT_TYPE_EQUAL)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                 .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
                 .build()
@@ -80,7 +82,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.expandContainers())
+                .setSplitType(SplitType.SPLIT_TYPE_EXPAND)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.LOCALE)
                 .build()
         )
@@ -120,11 +122,8 @@
             createTestOEMActivityStack(ArrayList(), true),
             createTestOEMActivityStack(ArrayList(), true),
             OEMSplitAttributes.Builder()
-                .setSplitType(
-                    OEMSplitAttributes.SplitType.HingeSplitType(
-                        OEMSplitAttributes.SplitType.RatioSplitType(0.3f)
-                    )
-                ).setLayoutDirection(TOP_TO_BOTTOM)
+                .setSplitType(OEMSplitAttributes.SplitType.HingeSplitType(RatioSplitType(0.5f)))
+                .setLayoutDirection(TOP_TO_BOTTOM)
                 .setAnimationBackgroundColor(Color.YELLOW)
                 .build(),
         )
@@ -132,7 +131,7 @@
             ActivityStack(ArrayList(), isEmpty = true),
             ActivityStack(ArrayList(), isEmpty = true),
             SplitAttributes.Builder()
-                .setSplitType(SplitType.splitByHinge(SplitType.ratio(0.3f)))
+                .setSplitType(SPLIT_TYPE_HINGE)
                 .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM)
                 .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.YELLOW))
                 .build()
diff --git a/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt b/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
index 69c507d..b896bb4 100644
--- a/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
+++ b/window/window/src/androidTest/java/androidx/window/embedding/SplitAttributesTest.kt
@@ -24,6 +24,9 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertNotEquals
 import org.junit.Assert.assertThrows
@@ -34,27 +37,27 @@
     @Test
     fun testSplitAttributesEquals() {
         val attrs1 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitEqually())
+            .setSplitType(SPLIT_TYPE_EQUAL)
             .setLayoutDirection(LOCALE)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs2 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(LOCALE)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs3 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.DEFAULT)
             .build()
         val attrs4 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GREEN))
             .build()
         val attrs5 = SplitAttributes.Builder()
-            .setSplitType(SplitType.splitByHinge())
+            .setSplitType(SPLIT_TYPE_HINGE)
             .setLayoutDirection(TOP_TO_BOTTOM)
             .setAnimationBackgroundColor(SplitAttributes.BackgroundColor.color(Color.GREEN))
             .build()
@@ -78,20 +81,12 @@
     @Test
     fun testTypesEquals() {
         val splitTypes = arrayOf(
-            SplitType.splitEqually(),
-            SplitType.expandContainers(),
-            SplitType.splitByHinge(),
-            SplitType.splitByHinge(SplitType.expandContainers())
+            SPLIT_TYPE_EQUAL,
+            SPLIT_TYPE_EXPAND,
+            SPLIT_TYPE_HINGE,
         )
 
         for ((i, type1) in splitTypes.withIndex()) {
-            if (type1 is SplitType.RatioSplitType) {
-                assertEquals(
-                    "Two SplitTypes must regarded as equal if their ratios are the same.",
-                    type1, SplitType.ratio(type1.value)
-                )
-                assertEquals(type1.hashCode(), SplitType.ratio(type1.value).hashCode())
-            }
             for ((j, type2) in splitTypes.withIndex()) {
                 if (i == j) {
                     assertEquals(type1, type2)
@@ -102,6 +97,12 @@
                 }
             }
         }
+
+        assertEquals(
+            "Two SplitTypes must regarded as equal if their ratios are the same.",
+            SPLIT_TYPE_EQUAL, SplitType.ratio(0.5f)
+        )
+        assertEquals(SPLIT_TYPE_EQUAL.hashCode(), SplitType.ratio(0.5f).hashCode())
     }
 
     @Test
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
index d97e70a..111a858 100644
--- a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -43,9 +43,14 @@
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.RIGHT_TO_LEFT
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.TOP_TO_BOTTOM
 import androidx.window.embedding.SplitAttributes.SplitType
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_HINGE
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EXPAND
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.ratio
 import androidx.window.extensions.WindowExtensions
 import androidx.window.extensions.core.util.function.Function
 import androidx.window.extensions.core.util.function.Predicate
+import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_ADJACENT
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_ALWAYS
 import androidx.window.extensions.embedding.SplitPairRule.FINISH_NEVER
@@ -91,8 +96,14 @@
 
     internal fun translate(splitAttributes: OEMSplitAttributes): SplitAttributes =
         SplitAttributes.Builder()
-            .setSplitType(translate(splitAttributes.splitType))
-            .setLayoutDirection(
+            .setSplitType(
+                when (val splitType = splitAttributes.splitType) {
+                    is OEMSplitType.HingeSplitType -> SPLIT_TYPE_HINGE
+                    is OEMSplitType.ExpandContainersSplitType -> SPLIT_TYPE_EXPAND
+                    is OEMSplitType.RatioSplitType -> ratio(splitType.ratio)
+                    else -> throw IllegalArgumentException("Unknown split type: $splitType")
+                }
+            ).setLayoutDirection(
                 when (val layoutDirection = splitAttributes.layoutDirection) {
                     OEMSplitAttributes.LayoutDirection.LEFT_TO_RIGHT -> LEFT_TO_RIGHT
                     OEMSplitAttributes.LayoutDirection.RIGHT_TO_LEFT -> RIGHT_TO_LEFT
@@ -109,26 +120,6 @@
             )
             .build()
 
-    private fun translate(splitType: OEMSplitType): SplitType =
-        when (splitType) {
-            is OEMSplitType.RatioSplitType -> translate(splitType)
-            is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
-            is OEMSplitType.HingeSplitType -> translate(splitType)
-            else -> throw IllegalArgumentException("Unsupported split type: $splitType")
-        }
-
-    private fun translate(hinge: OEMSplitType.HingeSplitType): SplitType.HingeSplitType =
-        SplitType.splitByHinge(
-            when (val splitType = hinge.fallbackSplitType) {
-                is OEMSplitType.ExpandContainersSplitType -> SplitType.expandContainers()
-                is OEMSplitType.RatioSplitType -> translate(splitType)
-                else -> throw IllegalArgumentException("Unsupported split type: $splitType")
-            }
-        )
-
-    private fun translate(splitRatio: OEMSplitType.RatioSplitType): SplitType.RatioSplitType =
-        SplitType.ratio(splitRatio.ratio)
-
     @OptIn(ExperimentalWindowApi::class)
     fun translateSplitAttributesCalculator(
         calculator: (SplitAttributesCalculatorParams) -> SplitAttributes
@@ -205,7 +196,7 @@
         }
     }
 
-    internal fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
+    fun translateSplitAttributes(splitAttributes: SplitAttributes): OEMSplitAttributes {
         require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
         // To workaround the "unused" error in ktlint. It is necessary to translate SplitAttributes
         // from WM Jetpack version to WM extension version.
@@ -230,25 +221,22 @@
     private fun translateSplitType(splitType: SplitType): OEMSplitType {
         require(vendorApiLevel >= WindowExtensions.VENDOR_API_LEVEL_2)
         return when (splitType) {
-            is SplitType.HingeSplitType -> translateHinge(splitType)
-            is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
-            is SplitType.RatioSplitType -> translateRatio(splitType)
-            else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
+            SPLIT_TYPE_HINGE -> OEMSplitType.HingeSplitType(
+                translateSplitType(SPLIT_TYPE_EQUAL)
+            )
+            SPLIT_TYPE_EXPAND -> OEMSplitType.ExpandContainersSplitType()
+            else -> {
+                val ratio = splitType.value
+                if (ratio > 0.0 && ratio < 1.0) {
+                    RatioSplitType(ratio)
+                } else {
+                    throw IllegalArgumentException("Unsupported SplitType: $splitType with value:" +
+                        " ${splitType.value}")
+                }
+            }
         }
     }
 
-    private fun translateHinge(hinge: SplitType.HingeSplitType): OEMSplitType.HingeSplitType =
-        OEMSplitType.HingeSplitType(
-            when (val splitType = hinge.fallbackSplitType) {
-                is SplitType.ExpandContainersSplitType -> OEMSplitType.ExpandContainersSplitType()
-                is SplitType.RatioSplitType -> translateRatio(splitType)
-                else -> throw IllegalArgumentException("Unsupported splitType: $splitType")
-            }
-        )
-
-    private fun translateRatio(splitRatio: SplitType.RatioSplitType): OEMSplitType.RatioSplitType =
-        OEMSplitType.RatioSplitType(splitRatio.ratio)
-
     private fun translateSplitPlaceholderRule(
         context: Context,
         rule: SplitPlaceholderRule,
@@ -490,7 +478,7 @@
          * higher.
          */
         private fun isSplitAttributesSupported(attrs: SplitAttributes) =
-            attrs.splitType is SplitType.RatioSplitType &&
+            attrs.splitType.value in 0.0..1.0 && attrs.splitType.value != 1.0f &&
                 attrs.layoutDirection in arrayOf(LEFT_TO_RIGHT, RIGHT_TO_LEFT, LOCALE)
 
         @SuppressLint("ClassVerificationFailure", "NewApi")
@@ -513,40 +501,16 @@
                 splitRule.checkParentMetrics(context, windowMetrics)
             }
 
-        // TODO(b/267391190): Remove the NoSuchMethodError in EmbeddingAdapter
-        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo {
-            val primaryActivityStack = splitInfo.primaryActivityStack
-            val isPrimaryStackEmpty = try {
-                primaryActivityStack.isEmpty
-            } catch (e: NoSuchMethodError) {
-                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
-                // value for this case to avoid crash.
-                false
-            }
-            val primaryFragment = ActivityStack(
-                primaryActivityStack.activities,
-                isPrimaryStackEmpty
+        fun translateCompat(splitInfo: OEMSplitInfo): SplitInfo = SplitInfo(
+                ActivityStack(
+                    splitInfo.primaryActivityStack.activities,
+                    splitInfo.primaryActivityStack.isEmpty,
+                ),
+                ActivityStack(
+                    splitInfo.secondaryActivityStack.activities,
+                    splitInfo.secondaryActivityStack.isEmpty,
+                ),
+                getSplitAttributesCompat(splitInfo),
             )
-
-            val secondaryActivityStack = splitInfo.secondaryActivityStack
-            val isSecondaryStackEmpty = try {
-                secondaryActivityStack.isEmpty
-            } catch (e: NoSuchMethodError) {
-                // Users may use older library which #isEmpty hasn't existed. Provide a fallback
-                // value for this case to avoid crash.
-                false
-            }
-            val secondaryFragment = ActivityStack(
-                secondaryActivityStack.activities,
-                isSecondaryStackEmpty
-            )
-
-            val splitAttributes = getSplitAttributesCompat(splitInfo)
-            return SplitInfo(
-                primaryFragment,
-                secondaryFragment,
-                splitAttributes
-            )
-        }
     }
 }
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
index 64219d2..645a56d 100644
--- a/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
+++ b/window/window/src/main/java/androidx/window/embedding/SplitAttributes.kt
@@ -25,7 +25,7 @@
 import androidx.window.core.VerificationMode
 import androidx.window.embedding.SplitAttributes.BackgroundColor
 import androidx.window.embedding.SplitAttributes.LayoutDirection.Companion.LOCALE
-import androidx.window.embedding.SplitAttributes.SplitType.Companion.splitEqually
+import androidx.window.embedding.SplitAttributes.SplitType.Companion.SPLIT_TYPE_EQUAL
 
 /**
  * Attributes that describe how the parent window (typically the activity task
@@ -65,7 +65,7 @@
      * The split type attribute. Defaults to an equal split of the parent window
      * for the primary and secondary containers.
      */
-    val splitType: SplitType = splitEqually(),
+    val splitType: SplitType = SPLIT_TYPE_EQUAL,
 
     /**
      * The layout direction attribute for the parent window split. The default
@@ -90,7 +90,7 @@
      * The type of parent window split, which defines the proportion of the
      * parent window occupied by the primary and secondary activity containers.
      */
-    open class SplitType internal constructor(
+    class SplitType internal constructor(
 
         /**
          * The description of this `SplitType`.
@@ -135,53 +135,9 @@
         override fun hashCode(): Int = description.hashCode() + 31 * value.hashCode()
 
         /**
-         * A window split that's based on the ratio of the size of the primary
-         * container to the size of the parent window.
-         *
-         * @see SplitAttributes.SplitType.ratio
-         */
-        class RatioSplitType internal constructor(
-
-            /**
-             * The proportion of the parent window occupied by the primary
-             * container of the split.
-             */
-            @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
-            val ratio: Float
-
-        ) : SplitType("ratio:$ratio", ratio)
-
-        /**
-         * A window split in which the primary and secondary activity containers
-         * each occupy the entire parent window.
-         *
-         * The secondary container overlays the primary container.
-         *
-         * @see SplitAttributes.SplitType.ExpandContainersSplitType
-         */
-        class ExpandContainersSplitType internal constructor() : SplitType("expandContainer", 0.0f)
-
-        /**
-         * A parent window split that conforms to a hinge or separating fold in
-         * the device display.
-         *
-         * @see SplitAttributes.SplitType.splitByHinge
-         */
-        class HingeSplitType internal constructor(
-
-            /**
-             * The split type to use if a split based on the device hinge or
-             * separating fold cannot be determined.
-             */
-            val fallbackSplitType: SplitType
-
-        ) : SplitType("hinge, fallback=$fallbackSplitType", -1.0f)
-
-        /**
          * Methods that create various split types.
          */
         companion object {
-
             /**
              * Creates a split type based on the proportion of the parent window
              * occupied by the primary container of the split.
@@ -197,13 +153,13 @@
              *
              * @param ratio The proportion of the parent window occupied by the
              *     primary container of the split.
-             * @return An instance of [RatioSplitType] with the specified ratio.
+             * @return An instance of `SplitType` with the specified ratio.
              */
             @JvmStatic
             fun ratio(
                 @FloatRange(from = 0.0, to = 1.0, fromInclusive = false, toInclusive = false)
                 ratio: Float
-            ): RatioSplitType {
+            ): SplitType {
                 val checkedRatio = ratio.startSpecification(
                     TAG,
                     VerificationMode.STRICT
@@ -211,45 +167,37 @@
                     "Use SplitType.expandContainers() instead of 0 or 1.") {
                     ratio in 0.0..1.0 && ratio !in arrayOf(0.0f, 1.0f)
                 }.compute()!!
-                return RatioSplitType(checkedRatio)
+                return SplitType("ratio:$checkedRatio", checkedRatio)
             }
 
-            private val EXPAND_CONTAINERS = ExpandContainersSplitType()
-
             /**
-             * Creates a split type in which the primary and secondary activity
-             * containers each expand to fill the parent window; the secondary
-             * container overlays the primary container.
+             * A split type in which the primary and secondary activity containers each expand to
+             * fill the parent window; the secondary container overlays the primary container.
              *
-             * Use this method with the function set in
+             * It is useful to use this `SplitType` with the function set in
              * [SplitController.setSplitAttributesCalculator] to expand the activity containers in
-             * some device states. The following sample shows how to always fill the parent bounds
-             * if the device is in portrait orientation:
+             * some device or window states. The following sample shows how to always fill the
+             * parent bounds if the device is in portrait orientation:
              *
              * @sample androidx.window.samples.embedding.expandContainersInPortrait
-             *
-             * @return An instance of [ExpandContainersSplitType].
              */
-            @JvmStatic
-            fun expandContainers(): ExpandContainersSplitType = EXPAND_CONTAINERS
+            @JvmField
+            val SPLIT_TYPE_EXPAND = SplitType("expandContainers", 0.0f)
 
             /**
-             * Creates a split type in which the primary and secondary
-             * containers occupy equal portions of the parent window.
+             * A split type in which the primary and secondary containers occupy equal portions of
+             * the parent window.
              *
              * Serves as the default [SplitType].
-             *
-             * @return A `RatioSplitType` in which the activity containers
-             *     occupy equal portions of the parent window.
              */
-            @JvmStatic
-            fun splitEqually(): RatioSplitType = ratio(0.5f)
+            @JvmField
+            val SPLIT_TYPE_EQUAL = ratio(0.5f)
 
             /**
-             * Creates a split type in which the split ratio conforms to the
+             * A split type in which the split ratio conforms to the
              * position of a hinge or separating fold in the device display.
              *
-             * The split type is created only if:
+             * The split type works only if:
              * <ul>
              *     <li>The host task is not in multi-window mode (e.g.,
              *         split-screen mode or picture-in-picture mode)</li>
@@ -268,40 +216,29 @@
              *     </li>
              * </ul>
              *
-             * Otherwise, the method falls back to `fallbackSplitType`.
+             * Otherwise, this `SplitType` fallback to show the split with [SPLIT_TYPE_EQUAL].
              *
-             * @param fallbackSplitType The split type to use if a split based
-             *     on the device hinge or separating fold cannot be determined.
-             *     Can be a [RatioSplitType] or [ExpandContainersSplitType].
-             *     Defaults to [SplitType.splitEqually].
-             * @return An instance of [HingeSplitType] with a fallback split
-             *     type.
+             * If the app wants to have another fallback `SplitType` if [SPLIT_TYPE_HINGE] cannot
+             * be applied. It is suggested to use [SplitController.setSplitAttributesCalculator] to
+             * customize the fallback `SplitType`.
+             *
+             * The following sample shows how to fallback to [SPLIT_TYPE_EXPAND]
+             * if there's no hinge area in the parent window container bounds.
+             *
+             * @sample androidx.window.samples.embedding.fallbackToExpandContainersForSplitTypeHinge
              */
-            @JvmStatic
-            fun splitByHinge(
-                fallbackSplitType: SplitType = splitEqually()
-            ): HingeSplitType {
-                val checkedType = fallbackSplitType.startSpecification(
-                    TAG,
-                    VerificationMode.STRICT
-                ).require(
-                    "FallbackSplitType must be a RatioSplitType or ExpandContainerSplitType"
-                ) {
-                    fallbackSplitType is RatioSplitType ||
-                        fallbackSplitType is ExpandContainersSplitType
-                }.compute()!!
-                return HingeSplitType(checkedType)
-            }
+            @JvmField
+            val SPLIT_TYPE_HINGE = SplitType("hinge", -1.0f)
 
+            // TODO(b/241044092): add XML support to SPLIT_TYPE_HINGE
             /**
              * Returns a `SplitType` with the given `value`.
              */
             @SuppressLint("Range") // value = 0.0 is covered.
-            @JvmStatic
             internal fun buildSplitTypeFromValue(
                 @FloatRange(from = 0.0, to = 1.0, toInclusive = false) value: Float
-            ) = if (value == EXPAND_CONTAINERS.value) {
-                    expandContainers()
+            ) = if (value == SPLIT_TYPE_EXPAND.value) {
+                    SPLIT_TYPE_EXPAND
                 } else {
                     ratio(value)
                 }
@@ -558,7 +495,7 @@
      *    window background color.
      */
     class Builder {
-        private var splitType: SplitType = splitEqually()
+        private var splitType = SPLIT_TYPE_EQUAL
         private var layoutDirection = LOCALE
         private var animationBackgroundColor = BackgroundColor.DEFAULT
 
