diff --git a/icu4c/source/i18n/measfmt.cpp b/icu4c/source/i18n/measfmt.cpp
index 08e6f66..ec8b47a 100644
--- a/icu4c/source/i18n/measfmt.cpp
+++ b/icu4c/source/i18n/measfmt.cpp
@@ -581,7 +581,10 @@
         UMeasureFormatWidth w,
         NumberFormat *nfToAdopt,
         UErrorCode &status) {
-    static const char *listStyles[] = {"unit", "unit-short", "unit-narrow"};
+    static const UListFormatterWidth listWidths[] = {
+        ULISTFMT_WIDTH_WIDE,
+        ULISTFMT_WIDTH_SHORT,
+        ULISTFMT_WIDTH_NARROW};
     LocalPointer<NumberFormat> nf(nfToAdopt);
     if (U_FAILURE(status)) {
         return;
@@ -620,7 +623,8 @@
     delete listFormatter;
     listFormatter = ListFormatter::createInstance(
             locale,
-            listStyles[getRegularWidth(fWidth)],
+            ULISTFMT_TYPE_UNITS,
+            listWidths[getRegularWidth(fWidth)],
             status);
 }
 
diff --git a/icu4c/source/i18n/unicode/listformatter.h b/icu4c/source/i18n/unicode/listformatter.h
index 76a7289..d7ab1d2 100644
--- a/icu4c/source/i18n/unicode/listformatter.h
+++ b/icu4c/source/i18n/unicode/listformatter.h
@@ -197,22 +197,6 @@
      */
     static ListFormatter* createInstance(
       const Locale& locale, UListFormatterType type, UListFormatterWidth width, UErrorCode& errorCode);
-  
-#ifndef U_HIDE_INTERNAL_API
-    /**
-     * Creates a ListFormatter appropriate for a locale and style.
-     *
-     * TODO(ICU-20888): Remove this in ICU 68.
-     *
-     * @param locale The locale.
-     * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short"
-     * @param errorCode ICU error code, set if no data available for the given locale.
-     * @return A ListFormatter object created from internal data derived from
-     *     CLDR data.
-     * @internal
-     */
-    static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode);
-#endif  /* U_HIDE_INTERNAL_API */
 
     /**
      * Destructor.
@@ -273,6 +257,15 @@
 #endif  /* U_HIDE_INTERNAL_API */
 
   private:
+  
+    /**
+     * Creates a ListFormatter appropriate for a locale and style.
+     *
+     * @param locale The locale.
+     * @param style the style, either "standard", "or", "unit", "unit-narrow", or "unit-short"
+     */
+    static ListFormatter* createInstance(const Locale& locale, const char* style, UErrorCode& errorCode);
+
     static void initializeHash(UErrorCode& errorCode);
     static const ListFormatInternal* getListFormatInternal(const Locale& locale, const char *style, UErrorCode& errorCode);
     struct ListPatternsSink;
diff --git a/icu4c/source/test/intltest/listformattertest.cpp b/icu4c/source/test/intltest/listformattertest.cpp
index 34536e6..8316422 100644
--- a/icu4c/source/test/intltest/listformattertest.cpp
+++ b/icu4c/source/test/intltest/listformattertest.cpp
@@ -45,7 +45,6 @@
     TESTCASE_AUTO(TestFieldPositionIteratorWith3ItemsPatternShift);
     TESTCASE_AUTO(TestFormattedValue);
     TESTCASE_AUTO(TestDifferentStyles);
-    TESTCASE_AUTO(TestBadStylesFail);
     TESTCASE_AUTO(TestCreateStyled);
     TESTCASE_AUTO(TestContextual);
     TESTCASE_AUTO(TestNextPosition);
@@ -276,8 +275,11 @@
         const char16_t *expectedFormatted,
         const char* testName) {
     IcuTestErrorCode errorCode(*this, testName);
-    LocalPointer<ListFormatter> formatter(
-        ListFormatter::createInstance(Locale("ur", "IN"), "unit-narrow", errorCode));
+    LocalPointer<ListFormatter> formatter(ListFormatter::createInstance(
+        Locale("ur", "IN"),
+        ULISTFMT_TYPE_UNITS,
+        ULISTFMT_WIDTH_NARROW,
+        errorCode));
     if (U_FAILURE(errorCode)) {
         dataerrln(
             "ListFormatter::createInstance(Locale(\"ur\", \"IN\"), \"unit-narrow\", errorCode) failed in "
@@ -608,16 +610,22 @@
     }
 }
 
-void ListFormatterTest::DoTheRealListStyleTesting(Locale locale,
-        UnicodeString items[], int itemCount,
-        const char* style, const char* expected, IcuTestErrorCode status) {
+void ListFormatterTest::DoTheRealListStyleTesting(
+        Locale locale,
+        UnicodeString items[],
+        int itemCount,
+        UListFormatterType type,
+        UListFormatterWidth width,
+        const char* expected,
+        IcuTestErrorCode status) {
 
     LocalPointer<ListFormatter> formatter(
-            ListFormatter::createInstance(locale, style, status));
+            ListFormatter::createInstance(locale, type, width, status));
 
     UnicodeString actualResult;
     formatter->format(items, itemCount, actualResult, status);
-    assertEquals(style, UnicodeString(expected), actualResult);
+    assertEquals(Int64ToUnicodeString(type) + "-" + Int64ToUnicodeString(width),
+        UnicodeString(expected), actualResult);
 }
 
 void ListFormatterTest::TestDifferentStyles() {
@@ -625,24 +633,11 @@
     UnicodeString input[4] = { u"rouge", u"jaune", u"bleu", u"vert" };
     IcuTestErrorCode status(*this, "TestDifferentStyles()");
 
-    DoTheRealListStyleTesting(locale, input, 4, "standard", "rouge, jaune, bleu et vert", status);
-    DoTheRealListStyleTesting(locale, input, 4, "or", "rouge, jaune, bleu ou vert", status);
-    DoTheRealListStyleTesting(locale, input, 4, "unit", "rouge, jaune, bleu et vert", status);
-    DoTheRealListStyleTesting(locale, input, 4, "unit-narrow", "rouge jaune bleu vert", status);
-    DoTheRealListStyleTesting(locale, input, 4, "unit-short", "rouge, jaune, bleu et vert", status);
-}
-
-void ListFormatterTest::TestBadStylesFail() {
-    Locale locale("fr");
-    const char * badStyles[4] = { "", "duration", "duration-short", "something-clearly-wrong" };
-    IcuTestErrorCode status(*this, "TestBadStylesFail()");
-
-    for (int i = 0; i < 4; ++i) {
-      LocalPointer<ListFormatter> formatter(ListFormatter::createInstance(locale, badStyles[i], status));
-      if (!status.expectErrorAndReset(U_MISSING_RESOURCE_ERROR, "style \"%s\"", badStyles[i])) {
-        // Do nothing, expectErrorAndReset already reports the error
-      }
-    }
+    DoTheRealListStyleTesting(locale, input, 4, ULISTFMT_TYPE_AND, ULISTFMT_WIDTH_WIDE, "rouge, jaune, bleu et vert", status);
+    DoTheRealListStyleTesting(locale, input, 4, ULISTFMT_TYPE_OR, ULISTFMT_WIDTH_WIDE, "rouge, jaune, bleu ou vert", status);
+    DoTheRealListStyleTesting(locale, input, 4, ULISTFMT_TYPE_UNITS, ULISTFMT_WIDTH_WIDE, "rouge, jaune, bleu et vert", status);
+    DoTheRealListStyleTesting(locale, input, 4, ULISTFMT_TYPE_UNITS, ULISTFMT_WIDTH_NARROW, "rouge jaune bleu vert", status);
+    DoTheRealListStyleTesting(locale, input, 4, ULISTFMT_TYPE_UNITS, ULISTFMT_WIDTH_SHORT, "rouge, jaune, bleu et vert", status);
 }
 
 void ListFormatterTest::TestCreateStyled() {
diff --git a/icu4c/source/test/intltest/listformattertest.h b/icu4c/source/test/intltest/listformattertest.h
index aeba483..0805e7b 100644
--- a/icu4c/source/test/intltest/listformattertest.h
+++ b/icu4c/source/test/intltest/listformattertest.h
@@ -52,7 +52,6 @@
     void TestFieldPositionIteratorWith3ItemsPatternShift();
     void TestFormattedValue();
     void TestDifferentStyles();
-    void TestBadStylesFail();
     void TestCreateStyled();
     void TestContextual();
     void TestNextPosition();
@@ -111,8 +110,9 @@
     void DoTheRealListStyleTesting(
         Locale locale,
         UnicodeString items[],
-        int32_t itemCount,
-        const char* style,
+        int itemCount,
+        UListFormatterType type,
+        UListFormatterWidth width,
         const char* expected,
         IcuTestErrorCode status);
 
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
index e746e8f..ebde045 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ListFormatter.java
@@ -51,66 +51,6 @@
     private final PatternHandler patternHandler;
 
     /**
-     * Indicates the style of Listformatter
-     * TODO(ICU-20888): Remove this in ICU 68.
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    public enum Style {
-        /**
-         * Standard, conjunction style.
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        STANDARD("standard"),
-        /**
-         * Disjunction style.
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        OR("or"),
-        /**
-         * Style for full units
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        UNIT("unit"),
-        /**
-         * Style for units in abbreviated form
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        UNIT_SHORT("unit-short"),
-        /**
-         * Style for units in narrow form
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        UNIT_NARROW("unit-narrow");
-
-        private final String name;
-
-        Style(String name) {
-            this.name = name;
-        }
-        /**
-         * @internal
-         * @deprecated This API is ICU internal only.
-         */
-        @Deprecated
-        public String getName() {
-            return name;
-        }
-
-    }
-
-    /**
      * Type of meaning expressed by the list.
      *
      * @draft ICU 67
@@ -417,20 +357,6 @@
     }
 
     /**
-     * Create a list formatter that is appropriate for a locale and style.
-     *
-     * @param locale the locale in question.
-     * @param style the style
-     * @return ListFormatter
-     * @internal
-     * @deprecated This API is ICU internal only.
-     */
-    @Deprecated
-    public static ListFormatter getInstance(ULocale locale, Style style) {
-        return cache.get(locale, style.getName());
-    }
-
-    /**
      * Create a list formatter that is appropriate for a locale.
      *
      * @param locale
@@ -439,7 +365,7 @@
      * @stable ICU 50
      */
     public static ListFormatter getInstance(ULocale locale) {
-      return getInstance(locale, Style.STANDARD);
+      return getInstance(locale, Type.AND, Width.WIDE);
     }
 
     /**
@@ -451,7 +377,7 @@
      * @stable ICU 50
      */
     public static ListFormatter getInstance(Locale locale) {
-        return getInstance(ULocale.forLocale(locale), Style.STANDARD);
+        return getInstance(ULocale.forLocale(locale), Type.AND, Width.WIDE);
     }
 
     /**
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
index e0665f0..b9f072a 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/text/MeasureFormat.java
@@ -160,21 +160,21 @@
          *
          * @stable ICU 53
          */
-        WIDE(ListFormatter.Style.UNIT, UnitWidth.FULL_NAME, UnitWidth.FULL_NAME),
+        WIDE(ListFormatter.Width.WIDE, UnitWidth.FULL_NAME, UnitWidth.FULL_NAME),
 
         /**
          * Abbreviate when possible.
          *
          * @stable ICU 53
          */
-        SHORT(ListFormatter.Style.UNIT_SHORT, UnitWidth.SHORT, UnitWidth.ISO_CODE),
+        SHORT(ListFormatter.Width.SHORT, UnitWidth.SHORT, UnitWidth.ISO_CODE),
 
         /**
          * Brief. Use only a symbol for the unit when possible.
          *
          * @stable ICU 53
          */
-        NARROW(ListFormatter.Style.UNIT_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
+        NARROW(ListFormatter.Width.NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
         /**
          * Identical to NARROW except when formatMeasures is called with an hour and minute; minute and
@@ -183,7 +183,7 @@
          *
          * @stable ICU 53
          */
-        NUMERIC(ListFormatter.Style.UNIT_NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
+        NUMERIC(ListFormatter.Width.NARROW, UnitWidth.NARROW, UnitWidth.SHORT),
 
         /**
          * The default format width for getCurrencyFormat(), which is to show the symbol for currency
@@ -193,9 +193,9 @@
          * @deprecated ICU 61 This API is ICU internal only.
          */
         @Deprecated
-        DEFAULT_CURRENCY(ListFormatter.Style.UNIT, UnitWidth.FULL_NAME, UnitWidth.SHORT);
+        DEFAULT_CURRENCY(ListFormatter.Width.SHORT, UnitWidth.FULL_NAME, UnitWidth.SHORT);
 
-        private final ListFormatter.Style listFormatterStyle;
+        final ListFormatter.Width listWidth;
 
         /**
          * The {@link UnitWidth} (used for newer NumberFormatter API) that corresponds to this
@@ -209,15 +209,14 @@
          */
         final UnitWidth currencyWidth;
 
-        private FormatWidth(ListFormatter.Style style, UnitWidth unitWidth, UnitWidth currencyWidth) {
-            this.listFormatterStyle = style;
+        private FormatWidth(
+                ListFormatter.Width listWidth,
+                UnitWidth unitWidth,
+                UnitWidth currencyWidth) {
+            this.listWidth = listWidth;
             this.unitWidth = unitWidth;
             this.currencyWidth = currencyWidth;
         }
-
-        ListFormatter.Style getListFormatterStyle() {
-            return listFormatterStyle;
-        }
     }
 
     /**
@@ -457,7 +456,8 @@
         }
 
         ListFormatter listFormatter = ListFormatter.getInstance(getLocale(),
-                formatWidth.getListFormatterStyle());
+                ListFormatter.Type.UNITS,
+                formatWidth.listWidth);
         if (fieldPosition != DontCareFieldPosition.INSTANCE) {
             formatMeasuresSlowTrack(listFormatter, appendTo, fieldPosition, measures);
             return;
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
index 9407bd5..6bfa555 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/ListFormatterTest.java
@@ -193,9 +193,9 @@
     }
 
 
-    void DoTheRealListStyleTesting(ULocale locale, String items[], ListFormatter.Style style, String expected) {
-        ListFormatter listFormatter = ListFormatter.getInstance(locale, style);
-        assertEquals("Style \"" + style + "\"", expected, listFormatter.format((Object[])items));
+    void DoTheRealListStyleTesting(ULocale locale, String items[], ListFormatter.Type type, ListFormatter.Width width, String expected) {
+        ListFormatter listFormatter = ListFormatter.getInstance(locale, type, width);
+        assertEquals("Style \"" + type + "/" + width + "\"", expected, listFormatter.format((Object[])items));
     }
 
     @Test
@@ -203,11 +203,11 @@
         ULocale locale = ULocale.FRENCH;
         String[] input = { "rouge", "jaune", "bleu", "vert" };
 
-        DoTheRealListStyleTesting(locale, input, ListFormatter.Style.STANDARD, "rouge, jaune, bleu et vert");
-        DoTheRealListStyleTesting(locale, input, ListFormatter.Style.OR, "rouge, jaune, bleu ou vert");
-        DoTheRealListStyleTesting(locale, input, ListFormatter.Style.UNIT, "rouge, jaune, bleu et vert");
-        DoTheRealListStyleTesting(locale, input, ListFormatter.Style.UNIT_NARROW, "rouge jaune bleu vert");
-        DoTheRealListStyleTesting(locale, input, ListFormatter.Style.UNIT_SHORT, "rouge, jaune, bleu et vert");
+        DoTheRealListStyleTesting(locale, input, ListFormatter.Type.AND, ListFormatter.Width.WIDE, "rouge, jaune, bleu et vert");
+        DoTheRealListStyleTesting(locale, input, ListFormatter.Type.OR, ListFormatter.Width.WIDE, "rouge, jaune, bleu ou vert");
+        DoTheRealListStyleTesting(locale, input, ListFormatter.Type.UNITS, ListFormatter.Width.WIDE, "rouge, jaune, bleu et vert");
+        DoTheRealListStyleTesting(locale, input, ListFormatter.Type.UNITS, ListFormatter.Width.NARROW, "rouge jaune bleu vert");
+        DoTheRealListStyleTesting(locale, input, ListFormatter.Type.UNITS, ListFormatter.Width.SHORT, "rouge, jaune, bleu et vert");
     }
 
     private boolean isDefaultLocaleEnglishLike() {
