diff --git a/modules/order/commerce_order.module b/modules/order/commerce_order.module
index 786e013..c174df0 100644
--- a/modules/order/commerce_order.module
+++ b/modules/order/commerce_order.module
@@ -999,19 +999,31 @@ function commerce_order_validate_number_unique($order_number, $order_id) {
  * database. The final array will be cached for subsequent calls.
  */
 function commerce_order_states() {
-  // First check the static cache for an order states array.
+  // First check the static cache and return it if found.
   $order_states = &drupal_static(__FUNCTION__);
 
-  // If it did not exist, fetch the statuses now.
-  if (empty($order_states)) {
-    $order_states = module_invoke_all('commerce_order_state_info');
+  if (!empty($order_states)) {
+    return $order_states;
+  }
 
-    // Give other modules a chance to alter the order states.
-    drupal_alter('commerce_order_state_info', $order_states);
+  // Then check the Drupal cache and return it if found.
+  $cache = cache_get('commerce_order_states');
 
-    uasort($order_states, 'drupal_sort_weight');
+  if ($cache && !empty($cache->data)) {
+    $order_states = $cache->data;
+    return $order_states;
   }
 
+  // If it did not exist in the cache, fetch and cache the states now.
+  $order_states = module_invoke_all('commerce_order_state_info');
+
+  // Give other modules a chance to alter the order states.
+  drupal_alter('commerce_order_state_info', $order_states);
+  uasort($order_states, 'drupal_sort_weight');
+
+  // Store the full array in the Drupal cache.
+  cache_set('commerce_order_states', $order_states);
+
   return $order_states;
 }
 
@@ -1019,6 +1031,7 @@ function commerce_order_states() {
  * Resets the cached list of order states.
  */
 function commerce_order_states_reset() {
+  cache_clear_all('commerce_order_states', 'cache');
   $order_states = &drupal_static('commerce_order_states');
   $order_states = NULL;
 }
