diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index a6d2b7a..08d54c6 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -924,7 +924,7 @@
             }
 
             final List<SuggestedWords.SuggestedWordInfo> applicationSuggestedWords =
-                    SuggestedWords.Builder.getFromApplicationSpecifiedCompletions(
+                    SuggestedWords.getFromApplicationSpecifiedCompletions(
                             applicationSpecifiedCompletions);
             SuggestedWords.Builder builder = new SuggestedWords.Builder(applicationSuggestedWords,
                     false /* typedWordValid */,
@@ -1788,7 +1788,7 @@
                 previousSuggestions = SuggestedWords.EMPTY;
             }
             final ArrayList<SuggestedWords.SuggestedWordInfo> typedWordAndPreviousSuggestions =
-                    SuggestedWords.Builder.getTypedWordAndPreviousSuggestions(
+                    SuggestedWords.getTypedWordAndPreviousSuggestions(
                             typedWord, previousSuggestions);
             final SuggestedWords.Builder obsoleteSuggestionsBuilder =
                     new SuggestedWords.Builder(typedWordAndPreviousSuggestions,
diff --git a/java/src/com/android/inputmethod/latin/Suggest.java b/java/src/com/android/inputmethod/latin/Suggest.java
index b02c973..3acbd27 100644
--- a/java/src/com/android/inputmethod/latin/Suggest.java
+++ b/java/src/com/android/inputmethod/latin/Suggest.java
@@ -270,7 +270,7 @@
         StringUtils.removeDupes(mSuggestions);
 
         return new SuggestedWords.Builder(
-                SuggestedWords.Builder.getFromCharSequenceList(mSuggestions),
+                SuggestedWords.getFromCharSequenceList(mSuggestions),
                 false /* typedWordValid */,
                 false /* hasMinimalSuggestion */,
                 false /* allowsToBeAutoCorrected */,
@@ -428,7 +428,7 @@
                         "--", false));
             }
         } else {
-            scoreInfoList = SuggestedWords.Builder.getFromCharSequenceList(mSuggestions);
+            scoreInfoList = SuggestedWords.getFromCharSequenceList(mSuggestions);
         }
 
         boolean autoCorrectionAvailable = hasAutoCorrection;
diff --git a/java/src/com/android/inputmethod/latin/SuggestedWords.java b/java/src/com/android/inputmethod/latin/SuggestedWords.java
index 0def1d4..5fae06f 100644
--- a/java/src/com/android/inputmethod/latin/SuggestedWords.java
+++ b/java/src/com/android/inputmethod/latin/SuggestedWords.java
@@ -98,44 +98,6 @@
             mShouldBlockAutoCorrectionBySafetyNet = shouldBlockAutoCorrectionBySafetyNet;
         }
 
-        public static ArrayList<SuggestedWordInfo> getFromCharSequenceList(
-                final List<CharSequence> wordList) {
-            final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
-            for (CharSequence word : wordList) {
-                if (null != word) result.add(new SuggestedWordInfo(word, null, false));
-            }
-            return result;
-        }
-
-        public static List<SuggestedWordInfo> getFromApplicationSpecifiedCompletions(
-                final CompletionInfo[] infos) {
-            final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
-            for (CompletionInfo info : infos) {
-                if (null != info) result.add(new SuggestedWordInfo(info.getText(), null, false));
-            }
-            return result;
-        }
-
-        // Should get rid of the first one (what the user typed previously) from suggestions
-        // and replace it with what the user currently typed.
-        public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions(
-                final CharSequence typedWord, final SuggestedWords previousSuggestions) {
-            final ArrayList<SuggestedWordInfo> suggestionsList = new ArrayList<SuggestedWordInfo>();
-            final HashSet<String> alreadySeen = new HashSet<String>();
-            suggestionsList.add(new SuggestedWordInfo(typedWord, null, false));
-            alreadySeen.add(typedWord.toString());
-            final int previousSize = previousSuggestions.size();
-            for (int pos = 1; pos < previousSize; pos++) {
-                final String prevWord = previousSuggestions.getWord(pos).toString();
-                // Filter out duplicate suggestion.
-                if (!alreadySeen.contains(prevWord)) {
-                    suggestionsList.add(new SuggestedWordInfo(prevWord, null, true));
-                    alreadySeen.add(prevWord);
-                }
-            }
-            return suggestionsList;
-        }
-
         public SuggestedWords build() {
             return new SuggestedWords(mTypedWordValid, mHasMinimalSuggestion,
                     mIsPunctuationSuggestions, mShouldBlockAutoCorrectionBySafetyNet,
@@ -143,6 +105,44 @@
         }
     }
 
+    public static ArrayList<SuggestedWordInfo> getFromCharSequenceList(
+            final List<CharSequence> wordList) {
+        final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
+        for (CharSequence word : wordList) {
+            if (null != word) result.add(new SuggestedWordInfo(word, null, false));
+        }
+        return result;
+    }
+
+    public static List<SuggestedWordInfo> getFromApplicationSpecifiedCompletions(
+            final CompletionInfo[] infos) {
+        final ArrayList<SuggestedWordInfo> result = new ArrayList<SuggestedWordInfo>();
+        for (CompletionInfo info : infos) {
+            if (null != info) result.add(new SuggestedWordInfo(info.getText(), null, false));
+        }
+        return result;
+    }
+
+    // Should get rid of the first one (what the user typed previously) from suggestions
+    // and replace it with what the user currently typed.
+    public static ArrayList<SuggestedWordInfo> getTypedWordAndPreviousSuggestions(
+            final CharSequence typedWord, final SuggestedWords previousSuggestions) {
+        final ArrayList<SuggestedWordInfo> suggestionsList = new ArrayList<SuggestedWordInfo>();
+        final HashSet<String> alreadySeen = new HashSet<String>();
+        suggestionsList.add(new SuggestedWordInfo(typedWord, null, false));
+        alreadySeen.add(typedWord.toString());
+        final int previousSize = previousSuggestions.size();
+        for (int pos = 1; pos < previousSize; pos++) {
+            final String prevWord = previousSuggestions.getWord(pos).toString();
+            // Filter out duplicate suggestion.
+            if (!alreadySeen.contains(prevWord)) {
+                suggestionsList.add(new SuggestedWordInfo(prevWord, null, true));
+                alreadySeen.add(prevWord);
+            }
+        }
+        return suggestionsList;
+    }
+
     public static class SuggestedWordInfo {
         public final CharSequence mWord;
         private final CharSequence mDebugString;
