diff --git a/ghc/lib/std/Ix.lhs b/ghc/lib/std/Ix.lhs
index 1b0783173db0273ee754f7b82c1835b024631762..9b25f62970dfd6a699be08363c85bd0df0df3eb5 100644
--- a/ghc/lib/std/Ix.lhs
+++ b/ghc/lib/std/Ix.lhs
@@ -76,10 +76,10 @@ indexError rng i tp
 
 ----------------------------------------------------------------------
 instance  Ix Char  where
-    range (m,n)
-      | m <= n  	=  [m..n]
-      | otherwise       =  []
+    {-# INLINE range #-}
+    range (m,n) = [m..n]
 
+    {-# INLINE unsafeIndex #-}
     unsafeIndex (m,n) i = fromEnum i - fromEnum m
 
     index b i | inRange b i =  unsafeIndex b i
@@ -89,10 +89,12 @@ instance  Ix Char  where
 
 ----------------------------------------------------------------------
 instance  Ix Int  where
-    range (m,n)
-      | m <= n	        =  [m..n]
-      | otherwise       =  []
+    {-# INLINE range #-}
+	-- The INLINE stops the build in the RHS from getting inlined,
+	-- so that callers can fuse with the result of range
+    range (m,n) = [m..n]
 
+    {-# INLINE unsafeIndex #-}
     unsafeIndex (m,n) i = i - m
 
     index b i | inRange b i =  unsafeIndex b i
@@ -103,10 +105,10 @@ instance  Ix Int  where
 
 ----------------------------------------------------------------------
 instance  Ix Integer  where
-    range (m,n)		
-      | m <= n          =  [m..n]
-      | otherwise       =  []
+    {-# INLINE range #-}
+    range (m,n) = [m..n]
 
+    {-# INLINE unsafeIndex #-}
     unsafeIndex (m,n) i   = fromInteger (i - m)
 
     index b i | inRange b i =  unsafeIndex b i
@@ -117,10 +119,10 @@ instance  Ix Integer  where
 
 ----------------------------------------------------------------------
 instance Ix Bool where -- as derived
-    range   (l,u) 
-      | l <= u    = map toEnum [fromEnum l .. fromEnum u]
-      | otherwise = []
+    {-# INLINE range #-}
+    range (m,n) = [m..n]
 
+    {-# INLINE unsafeIndex #-}
     unsafeIndex (l,_) i = fromEnum i - fromEnum l
 
     index b i | inRange b i =  unsafeIndex b i
@@ -130,12 +132,15 @@ instance Ix Bool where -- as derived
 
 ----------------------------------------------------------------------
 instance Ix Ordering where -- as derived
-    range   (l,u)
-      | l <= u    = map toEnum [fromEnum l .. fromEnum u]
-      | otherwise = []
+    {-# INLINE range #-}
+    range (m,n) = [m..n]
+
+    {-# INLINE unsafeIndex #-}
     unsafeIndex (l,_) i = fromEnum i - fromEnum l
+
     index b i | inRange b i =  unsafeIndex b i
 	      | otherwise   =  indexError b i "Ordering"
+
     inRange (l,u) i = fromEnum i >= fromEnum l && fromEnum i <= fromEnum u
 
 ----------------------------------------------------------------------