diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index becd4e7..f918046 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -269,7 +269,7 @@
 
         final CharSequence serviceState;
         final int fragmentType = AccessibilityUtil.getAccessibilityServiceFragmentType(info);
-        if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE) {
+        if (fragmentType == AccessibilityServiceFragmentType.INVISIBLE_TOGGLE) {
             final ComponentName componentName = new ComponentName(
                     info.getResolveInfo().serviceInfo.packageName,
                     info.getResolveInfo().serviceInfo.name);
@@ -652,13 +652,16 @@
         }
 
         private String getAccessibilityServiceFragmentTypeName(AccessibilityServiceInfo info) {
-            switch (AccessibilityUtil.getAccessibilityServiceFragmentType(
-                    info)) {
-                case AccessibilityServiceFragmentType.LEGACY:
-                    return LegacyAccessibilityServicePreferenceFragment.class.getName();
-                case AccessibilityServiceFragmentType.INVISIBLE:
+            // Shorten the name to avoid exceeding 100 characters in one line.
+            final String volumeShortcutToggleAccessibilityServicePreferenceFragment =
+                    VolumeShortcutToggleAccessibilityServicePreferenceFragment.class.getName();
+
+            switch (AccessibilityUtil.getAccessibilityServiceFragmentType(info)) {
+                case AccessibilityServiceFragmentType.VOLUME_SHORTCUT_TOGGLE:
+                    return volumeShortcutToggleAccessibilityServicePreferenceFragment;
+                case AccessibilityServiceFragmentType.INVISIBLE_TOGGLE:
                     return InvisibleToggleAccessibilityServicePreferenceFragment.class.getName();
-                case AccessibilityServiceFragmentType.INTUITIVE:
+                case AccessibilityServiceFragmentType.TOGGLE:
                     return ToggleAccessibilityServicePreferenceFragment.class.getName();
                 default:
                     // impossible status
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
index 2bcb5b3..090e5d4 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java
@@ -16,7 +16,7 @@
 
 package com.android.settings.accessibility;
 
-import static com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType.LEGACY;
+import static com.android.settings.accessibility.AccessibilityUtil.AccessibilityServiceFragmentType.VOLUME_SHORTCUT_TOGGLE;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.settings.SettingsEnums;
@@ -102,10 +102,10 @@
         super.onResume();
         updateAccessibilityServicePreference(mScreenReaderPreference,
                 SCREEN_READER_PACKAGE_NAME, SCREEN_READER_SERVICE_NAME,
-                LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.class.getName());
+                VolumeShortcutToggleScreenReaderPreferenceFragmentForSetupWizard.class.getName());
         updateAccessibilityServicePreference(mSelectToSpeakPreference,
                 SELECT_TO_SPEAK_PACKAGE_NAME, SELECT_TO_SPEAK_SERVICE_NAME,
-                LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.class.getName());
+                VolumeShortcutToggleSelectToSpeakPreferenceFragmentForSetupWizard.class.getName());
         configureMagnificationPreferenceIfNeeded(mDisplayMagnificationPreference);
     }
 
@@ -147,7 +147,7 @@
     }
 
     private void updateAccessibilityServicePreference(Preference preference,
-            String packageName, String serviceName, String targetLegacyFragment) {
+            String packageName, String serviceName, String targetFragment) {
         final AccessibilityServiceInfo info = findService(packageName, serviceName);
         if (info == null) {
             getPreferenceScreen().removePreference(preference);
@@ -159,8 +159,8 @@
         preference.setTitle(title);
         ComponentName componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);
         preference.setKey(componentName.flattenToString());
-        if (AccessibilityUtil.getAccessibilityServiceFragmentType(info) == LEGACY) {
-            preference.setFragment(targetLegacyFragment);
+        if (AccessibilityUtil.getAccessibilityServiceFragmentType(info) == VOLUME_SHORTCUT_TOGGLE) {
+            preference.setFragment(targetFragment);
         }
 
         // Update the extras.
diff --git a/src/com/android/settings/accessibility/AccessibilityUtil.java b/src/com/android/settings/accessibility/AccessibilityUtil.java
index a0e3d81..eb202b5 100644
--- a/src/com/android/settings/accessibility/AccessibilityUtil.java
+++ b/src/com/android/settings/accessibility/AccessibilityUtil.java
@@ -46,22 +46,23 @@
     /**
      * Annotation for different accessibilityService fragment UI type.
      *
-     * {@code LEGACY} for displaying appearance aligned with sdk version Q accessibility service
-     * page, but only hardware shortcut allowed.
-     * {@code INVISIBLE} for displaying appearance without switch bar.
-     * {@code INTUITIVE} for displaying appearance with new design.
+     * {@code VOLUME_SHORTCUT_TOGGLE} for displaying basic accessibility service fragment but
+     * only hardware shortcut allowed.
+     * {@code INVISIBLE_TOGGLE} for displaying basic accessibility service fragment without
+     * switch bar.
+     * {@code TOGGLE} for displaying basic accessibility service fragment.
      */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({
-            AccessibilityServiceFragmentType.LEGACY,
-            AccessibilityServiceFragmentType.INVISIBLE,
-            AccessibilityServiceFragmentType.INTUITIVE,
+            AccessibilityServiceFragmentType.VOLUME_SHORTCUT_TOGGLE,
+            AccessibilityServiceFragmentType.INVISIBLE_TOGGLE,
+            AccessibilityServiceFragmentType.TOGGLE,
     })
 
     public @interface AccessibilityServiceFragmentType {
-        int LEGACY = 0;
-        int INVISIBLE = 1;
-        int INTUITIVE = 2;
+        int VOLUME_SHORTCUT_TOGGLE = 0;
+        int INVISIBLE_TOGGLE = 1;
+        int TOGGLE = 2;
     }
 
     // TODO(b/147021230): Will move common functions and variables to
@@ -162,11 +163,11 @@
                 & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
 
         if (targetSdk <= Build.VERSION_CODES.Q) {
-            return AccessibilityServiceFragmentType.LEGACY;
+            return AccessibilityServiceFragmentType.VOLUME_SHORTCUT_TOGGLE;
         }
         return requestA11yButton
-                ? AccessibilityServiceFragmentType.INVISIBLE
-                : AccessibilityServiceFragmentType.INTUITIVE;
+                ? AccessibilityServiceFragmentType.INVISIBLE_TOGGLE
+                : AccessibilityServiceFragmentType.TOGGLE;
     }
 
     /**
diff --git a/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/VolumeShortcutToggleAccessibilityServicePreferenceFragment.java
similarity index 97%
rename from src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java
rename to src/com/android/settings/accessibility/VolumeShortcutToggleAccessibilityServicePreferenceFragment.java
index c5cede3..31f97a8 100644
--- a/src/com/android/settings/accessibility/LegacyAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/VolumeShortcutToggleAccessibilityServicePreferenceFragment.java
@@ -34,7 +34,7 @@
  *
  * <p>For accessibility services that target SDK <= Q.
  */
-public class LegacyAccessibilityServicePreferenceFragment extends
+public class VolumeShortcutToggleAccessibilityServicePreferenceFragment extends
         ToggleAccessibilityServicePreferenceFragment {
 
     @Override
diff --git a/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/VolumeShortcutToggleScreenReaderPreferenceFragmentForSetupWizard.java
similarity index 91%
rename from src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java
rename to src/com/android/settings/accessibility/VolumeShortcutToggleScreenReaderPreferenceFragmentForSetupWizard.java
index 1b37a42..6e4a233 100644
--- a/src/com/android/settings/accessibility/LegacyToggleScreenReaderPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/VolumeShortcutToggleScreenReaderPreferenceFragmentForSetupWizard.java
@@ -21,8 +21,8 @@
 import android.view.View;
 
 /** For accessibility services that target SDK <= Q in setup wizard. */
-public class LegacyToggleScreenReaderPreferenceFragmentForSetupWizard
-        extends LegacyAccessibilityServicePreferenceFragment {
+public class VolumeShortcutToggleScreenReaderPreferenceFragmentForSetupWizard
+        extends VolumeShortcutToggleAccessibilityServicePreferenceFragment {
 
     private boolean mToggleSwitchWasInitiallyChecked;
 
diff --git a/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/VolumeShortcutToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
similarity index 91%
rename from src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
rename to src/com/android/settings/accessibility/VolumeShortcutToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
index ffb363c..3dd648c 100644
--- a/src/com/android/settings/accessibility/LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/VolumeShortcutToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
@@ -21,8 +21,8 @@
 import android.view.View;
 
 /** For accessibility services that target SDK <= Q in setup wizard. */
-public class LegacyToggleSelectToSpeakPreferenceFragmentForSetupWizard
-        extends LegacyAccessibilityServicePreferenceFragment {
+public class VolumeShortcutToggleSelectToSpeakPreferenceFragmentForSetupWizard
+        extends VolumeShortcutToggleAccessibilityServicePreferenceFragment {
 
     private boolean mToggleSwitchWasInitiallyChecked;
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index c6a7684..bf63130 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -130,8 +130,8 @@
     }
 
     @Test
-    public void getServiceSummary_invisibleType_shortcutDisabled_showsOffSummary() {
-        setInvisibleFragmentType(mServiceInfo);
+    public void getServiceSummary_invisibleToggle_shortcutDisabled_showsOffSummary() {
+        setInvisibleToggleFragmentType(mServiceInfo);
         doReturn(DEFAULT_SUMMARY).when(mServiceInfo).loadSummary(any());
 
         final CharSequence summary = AccessibilitySettings.getServiceSummary(mContext,
@@ -277,7 +277,7 @@
         when(mockInfo.getComponentName()).thenReturn(DUMMY_COMPONENT_NAME);
     }
 
-    private void setInvisibleFragmentType(AccessibilityServiceInfo info) {
+    private void setInvisibleToggleFragmentType(AccessibilityServiceInfo info) {
         info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
         info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
     }
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
index b8936c4..ac3198f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityUtilTest.java
@@ -102,36 +102,36 @@
     }
 
     @Test
-    public void getAccessibilityServiceFragmentType_targetSdkQ_legacyType() {
+    public void getAccessibilityServiceFragmentType_targetSdkQ_volumeShortcutType() {
         final AccessibilityServiceInfo info = getMockAccessibilityServiceInfo();
 
         info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.Q;
         info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
 
         assertThat(AccessibilityUtil.getAccessibilityServiceFragmentType(info)).isEqualTo(
-                AccessibilityUtil.AccessibilityServiceFragmentType.LEGACY);
+                AccessibilityUtil.AccessibilityServiceFragmentType.VOLUME_SHORTCUT_TOGGLE);
     }
 
     @Test
-    public void getAccessibilityServiceFragmentType_targetSdkR_HaveA11yButton_headlessType() {
+    public void getAccessibilityServiceFragmentType_targetSdkR_HaveA11yButton_invisibleType() {
         final AccessibilityServiceInfo info = getMockAccessibilityServiceInfo();
 
         info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
         info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
 
         assertThat(AccessibilityUtil.getAccessibilityServiceFragmentType(info)).isEqualTo(
-                AccessibilityUtil.AccessibilityServiceFragmentType.INVISIBLE);
+                AccessibilityUtil.AccessibilityServiceFragmentType.INVISIBLE_TOGGLE);
     }
 
     @Test
-    public void getAccessibilityServiceFragmentType_targetSdkR_NoA11yButton_intuitiveType() {
+    public void getAccessibilityServiceFragmentType_targetSdkR_NoA11yButton_toggleType() {
         final AccessibilityServiceInfo info = getMockAccessibilityServiceInfo();
 
         info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = Build.VERSION_CODES.R;
         info.flags |= ~AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
 
         assertThat(AccessibilityUtil.getAccessibilityServiceFragmentType(info)).isEqualTo(
-                AccessibilityUtil.AccessibilityServiceFragmentType.INTUITIVE);
+                AccessibilityUtil.AccessibilityServiceFragmentType.TOGGLE);
     }
 
     @Test
