diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 4c2498893efefb4a2d738c75c3df41f2afb7d241..9dc57e308b08eea072928770e96a4ff7e7461fd2 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -34,7 +34,6 @@ import com.android.inputmethod.latin.InputView;
 import com.android.inputmethod.latin.LatinIME;
 import com.android.inputmethod.latin.R;
 import com.android.inputmethod.latin.RichInputMethodManager;
-import com.android.inputmethod.latin.SubtypeSwitcher;
 import com.android.inputmethod.latin.WordComposer;
 import com.android.inputmethod.latin.define.ProductionFlags;
 import com.android.inputmethod.latin.settings.Settings;
@@ -50,8 +49,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions,
         NetworkConnectivityUtils.NetworkStateChangeListener {
     private static final String TAG = KeyboardSwitcher.class.getSimpleName();
 
-    private SubtypeSwitcher mSubtypeSwitcher;
-
     private InputView mCurrentInputView;
     private View mMainKeyboardFrame;
     private MainKeyboardView mKeyboardView;
@@ -86,7 +83,6 @@ public final class KeyboardSwitcher implements KeyboardState.SwitchActions,
     private void initInternal(final LatinIME latinIme) {
         mLatinIME = latinIme;
         mRichImm = RichInputMethodManager.getInstance();
-        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
         mState = new KeyboardState(this);
         mIsHardwareAcceleratedDrawingEnabled =
                 InputMethodServiceCompatUtils.enableHardwareAcceleration(mLatinIME);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index d6ec57fe6a1681696e536cb6f7f4e0eedab55075..7f9cae58e16d75037f16653ee92a0af1fa74e29e 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -166,7 +166,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
 
     private RichInputMethodManager mRichImm;
     @UsedForTesting final KeyboardSwitcher mKeyboardSwitcher;
-    final SubtypeSwitcher mSubtypeSwitcher;
     private final SubtypeState mSubtypeState = new SubtypeState();
     private final EmojiAltPhysicalKeyDetector mEmojiAltPhysicalKeyDetector =
             new EmojiAltPhysicalKeyDetector();
@@ -563,7 +562,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
     public LatinIME() {
         super();
         mSettings = Settings.getInstance();
-        mSubtypeSwitcher = SubtypeSwitcher.getInstance();
         mKeyboardSwitcher = KeyboardSwitcher.getInstance();
         mStatsUtilsManager = StatsUtilsManager.getInstance();
         mIsHardwareAcceleratedDrawingEnabled =
@@ -577,7 +575,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         DebugFlags.init(PreferenceManager.getDefaultSharedPreferences(this));
         RichInputMethodManager.init(this);
         mRichImm = RichInputMethodManager.getInstance();
-        SubtypeSwitcher.init(this);
         KeyboardSwitcher.init(this);
         AudioAndHapticFeedbackManager.init(this);
         AccessibilityUtils.init(this);
@@ -869,7 +866,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         // Note that the calling sequence of onCreate() and onCurrentInputMethodSubtypeChanged()
         // is not guaranteed. It may even be called at the same time on a different thread.
         mRichImm.onSubtypeChanged(subtype);
-        mSubtypeSwitcher.onSubtypeChanged(mRichImm.getCurrentSubtype());
         mInputLogic.onSubtypeChanged(SubtypeLocaleUtils.getCombiningRulesExtraValue(subtype),
                 mSettings.getCurrent());
         loadKeyboard();
@@ -886,7 +882,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         // also wouldn't be consuming gesture data.
         mGestureConsumer = GestureConsumer.NULL_GESTURE_CONSUMER;
         mRichImm.refreshSubtypeCaches();
-        mSubtypeSwitcher.onSubtypeChanged(mRichImm.getCurrentSubtype());
         final KeyboardSwitcher switcher = mKeyboardSwitcher;
         switcher.updateKeyboardTheme();
         final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView();
@@ -948,10 +943,6 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
                 Settings.getInstance().getCurrent().mDisplayOrientation,
                 !isDifferentTextField);
 
-        if (isDifferentTextField) {
-            mSubtypeSwitcher.updateParametersOnStartInputView();
-        }
-
         // The EditorInfo might have a flag that affects fullscreen mode.
         // Note: This call should be done by InputMethodService?
         updateFullscreenMode();
diff --git a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
index cb1de6b17614baf53338b78654cfef1ab4ead9c6..1b1e81482dd5c7875b9ada158a35516a0e97c647 100644
--- a/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
+++ b/java/src/com/android/inputmethod/latin/RichInputMethodManager.java
@@ -36,6 +36,7 @@ import com.android.inputmethod.compat.InputMethodManagerCompatWrapper;
 import com.android.inputmethod.latin.settings.AdditionalFeaturesSettingUtils;
 import com.android.inputmethod.latin.settings.Settings;
 import com.android.inputmethod.latin.utils.AdditionalSubtypeUtils;
+import com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils;
 import com.android.inputmethod.latin.utils.NetworkConnectivityUtils;
 import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
 
@@ -513,6 +514,15 @@ public class RichInputMethodManager {
                     + (mShortcutSubtype == null ? "<null>" : (
                             mShortcutSubtype.getLocale() + ", " + mShortcutSubtype.getMode())));
         }
+        final RichInputMethodSubtype richSubtype = mCurrentRichInputMethodSubtype;
+        final boolean implicitlyEnabledSubtype = checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(
+                richSubtype.getRawSubtype());
+        final Locale systemLocale = mContext.getResources().getConfiguration().locale;
+        LanguageOnSpacebarUtils.onSubtypeChanged(
+                richSubtype, implicitlyEnabledSubtype, systemLocale);
+        LanguageOnSpacebarUtils.setEnabledSubtypes(getMyEnabledInputMethodSubtypeList(
+                true /* allowsImplicitlySelectedSubtypes */));
+
         // TODO: Update an icon for shortcut IME
         final Map<InputMethodInfo, List<InputMethodSubtype>> shortcuts =
                 getInputMethodManager().getShortcutInputMethodsAndSubtypes();
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
deleted file mode 100644
index d7a03d40b3c6df13de9f5eb9fe4da0dba373bcb0..0000000000000000000000000000000000000000
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.inputmethod.latin;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.view.inputmethod.InputMethodSubtype;
-
-import com.android.inputmethod.latin.utils.LanguageOnSpacebarUtils;
-import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
-
-import java.util.List;
-
-import javax.annotation.Nonnull;
-
-public final class SubtypeSwitcher {
-    private static final SubtypeSwitcher sInstance = new SubtypeSwitcher();
-
-    private /* final */ RichInputMethodManager mRichImm;
-    private /* final */ Resources mResources;
-
-    public static SubtypeSwitcher getInstance() {
-        return sInstance;
-    }
-
-    public static void init(final Context context) {
-        SubtypeLocaleUtils.init(context);
-        RichInputMethodManager.init(context);
-        sInstance.initialize(context);
-    }
-
-    private SubtypeSwitcher() {
-        // Intentional empty constructor for singleton.
-    }
-
-    private void initialize(final Context context) {
-        if (mResources != null) {
-            return;
-        }
-        mResources = context.getResources();
-        mRichImm = RichInputMethodManager.getInstance();
-
-        onSubtypeChanged(mRichImm.getCurrentSubtype());
-        updateParametersOnStartInputView();
-    }
-
-    /**
-     * Update parameters which are changed outside LatinIME. This parameters affect UI so that they
-     * should be updated every time onStartInputView is called.
-     */
-    public void updateParametersOnStartInputView() {
-        final List<InputMethodSubtype> enabledSubtypesOfThisIme =
-                mRichImm.getMyEnabledInputMethodSubtypeList(true);
-        LanguageOnSpacebarUtils.setEnabledSubtypes(enabledSubtypesOfThisIme);
-    }
-
-    // Update the current subtype. LatinIME.onCurrentInputMethodSubtypeChanged calls this function.
-    public void onSubtypeChanged(@Nonnull final RichInputMethodSubtype richSubtype) {
-        final boolean implicitlyEnabledSubtype = mRichImm
-                .checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(richSubtype.getRawSubtype());
-        LanguageOnSpacebarUtils.onSubtypeChanged(
-                richSubtype, implicitlyEnabledSubtype, mResources.getConfiguration().locale);
-    }
-}
diff --git a/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java b/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
index 4bd15d037a46aab56dd5164f2d39ab01f5a6a7ce..5a1cd8c202cfe4a9621cdc4fd429670aa49ed5da 100644
--- a/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
+++ b/java/src/com/android/inputmethod/latin/settings/AccountsSettingsFragment.java
@@ -33,9 +33,8 @@ import android.widget.Toast;
 
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.latin.R;
-import com.android.inputmethod.latin.SubtypeSwitcher;
-import com.android.inputmethod.latin.accounts.LoginAccountUtils;
 import com.android.inputmethod.latin.accounts.AccountStateChangedListener;
+import com.android.inputmethod.latin.accounts.LoginAccountUtils;
 import com.android.inputmethod.latin.define.ProductionFlags;
 
 import javax.annotation.Nullable;
@@ -63,12 +62,6 @@ public final class AccountsSettingsFragment extends SubScreenFragment {
         addPreferencesFromResource(R.xml.prefs_screen_accounts);
 
         final Resources res = getResources();
-        final Context context = getActivity();
-
-        // When we are called from the Settings application but we are not already running, some
-        // singleton and utility classes may not have been initialized.  We have to call
-        // initialization method of these classes here. See {@link LatinIME#onCreate()}.
-        SubtypeSwitcher.init(context);
 
         if (ProductionFlags.IS_METRICS_LOGGING_SUPPORTED) {
             final Preference enableMetricsLogging =