The different getAvailableLocales() output different information. This code: System.out.println("Locale.getAvailableLocales(): ["+Arrays.asList(Locale.getAvailableLocales())+"]."); System.out.println("NumberFormat.getAvailableLocales(): ["+Arrays.asList(NumberFormat.getAvailableLocales())+"]."); System.out.println("DateFormat.getAvailableLocales(): ["+Arrays.asList(DateFormat.getAvailableLocales())+"]."); System.out.println("Default Locale: ["+Locale.getDefault()+"]."); Outputs: Locale.getAvailableLocales(): [[en, fr, de, ga]]. NumberFormat.getAvailableLocales(): [[en_US]]. DateFormat.getAvailableLocales(): [[en_US]]. Default Locale: [en_US]. So, the single locale that the NumberFormat and DateFormat returns as "available" is not listed in the Locale class's available locales. This was slightly annoying for my application, that assumed that the formatters' available-ness was a subset of Locale's. But one thing that might anyway be a bug, is that the "Default Locale" when asking Locale, is a locale that Locale doesn't report when asked for its available locales.