diff --git a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 5f78cb91e90ddeac93b1da0a5352f8e9aec12231..0d116dcf96268703d1c747d0ea3101e46bb53caa 100644
--- a/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -499,26 +499,26 @@ public class KeyboardSwitcher implements SharedPreferences.OnSharedPreferenceCha
             if (isShiftLocked()) {
                 // Shift key is pressed while caps lock state, we will treat this state as shifted
                 // caps lock state and mark as if shift key pressed while normal state.
-                setManualTemporaryUpperCase(true);
                 shiftKeyState.onPress();
+                setManualTemporaryUpperCase(true);
             } else if (isAutomaticTemporaryUpperCase()) {
                 // Shift key is pressed while automatic temporary upper case, we have to move to
                 // manual temporary upper case.
+                shiftKeyState.onPress();
                 setManualTemporaryUpperCase(true);
-                shiftKeyState.onPressOnShifted();
             } else if (isShiftedOrShiftLocked()) {
                 // In manual upper case state, we just record shift key has been pressing while
                 // shifted state.
                 shiftKeyState.onPressOnShifted();
             } else {
                 // In base layout, chording or manual temporary upper case mode is started.
-                toggleShift();
                 shiftKeyState.onPress();
+                toggleShift();
             }
         } else {
             // In symbol mode, just toggle symbol and symbol more keyboard.
-            toggleShift();
             shiftKeyState.onPress();
+            toggleShift();
         }
     }
 
diff --git a/java/src/com/android/inputmethod/latin/ModifierKeyState.java b/java/src/com/android/inputmethod/latin/ModifierKeyState.java
index 07a5c4f7ff2165c83f6e63ce8a2caa16872686c7..8443be4339e7e5b9c4a79127c20cd9492efadebe 100644
--- a/java/src/com/android/inputmethod/latin/ModifierKeyState.java
+++ b/java/src/com/android/inputmethod/latin/ModifierKeyState.java
@@ -49,7 +49,7 @@ public class ModifierKeyState {
 
     public void onOtherKeyPressed() {
         final int oldState = mState;
-        if (mState == PRESSING)
+        if (oldState == PRESSING)
             mState = MOMENTARY;
         if (DEBUG)
             Log.d(TAG, mName + ".onOtherKeyPressed: " + toString(oldState) + " > " + this);
@@ -64,7 +64,7 @@ public class ModifierKeyState {
         return toString(mState);
     }
 
-    protected static String toString(int state) {
+    protected String toString(int state) {
         switch (state) {
         case RELEASING: return "RELEASING";
         case PRESSING: return "PRESSING";
diff --git a/java/src/com/android/inputmethod/latin/ShiftKeyState.java b/java/src/com/android/inputmethod/latin/ShiftKeyState.java
index ef13ddc9b68bf219a0fbd1ae333f3327e06f816e..7412a566de7c35de7d229a63bcaf856c3396a50d 100644
--- a/java/src/com/android/inputmethod/latin/ShiftKeyState.java
+++ b/java/src/com/android/inputmethod/latin/ShiftKeyState.java
@@ -29,9 +29,9 @@ public class ShiftKeyState extends ModifierKeyState {
     @Override
     public void onOtherKeyPressed() {
         int oldState = mState;
-        if (mState == PRESSING) {
+        if (oldState == PRESSING) {
             mState = MOMENTARY;
-        } else if (mState == PRESSING_ON_SHIFTED) {
+        } else if (oldState == PRESSING_ON_SHIFTED) {
             mState = IGNORING;
         }
         if (DEBUG)
@@ -58,11 +58,12 @@ public class ShiftKeyState extends ModifierKeyState {
         return toString(mState);
     }
 
-    protected static String toString(int state) {
+    @Override
+    protected String toString(int state) {
         switch (state) {
         case PRESSING_ON_SHIFTED: return "PRESSING_ON_SHIFTED";
         case IGNORING: return "IGNORING";
-        default: return ModifierKeyState.toString(state);
+        default: return super.toString(state);
         }
     }
 }