diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for Extra
 
+1.5
+    Change fromLeft/fromRight signatures to follow the base libraries
 1.4.12
     Add writeVar
 1.4.11
diff --git a/extra.cabal b/extra.cabal
--- a/extra.cabal
+++ b/extra.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.10
 build-type:         Simple
 name:               extra
-version:            1.4.12
+version:            1.5
 license:            BSD3
 license-file:       LICENSE
 category:           Development
diff --git a/src/Data/Either/Extra.hs b/src/Data/Either/Extra.hs
--- a/src/Data/Either/Extra.hs
+++ b/src/Data/Either/Extra.hs
@@ -11,23 +11,26 @@
 
 import Data.Either
 
--- | The 'fromLeft' function extracts the element out of a 'Left' and
---   throws an error if its argument is 'Right'.
---   Much like 'fromJust', using this function in polished code is usually a bad idea.
+
+#if __GLASGOW_HASKELL__ < 801
+
+-- | Return the contents of a 'Left'-value or a default value otherwise.
 --
--- > \x -> fromLeft (Left  x) == x
--- > \x -> fromLeft (Right x) == undefined
-fromLeft :: Either l r -> l
-fromLeft (Left x) = x
+-- > fromLeft 1 (Left 3) == 3
+-- > fromLeft 1 (Right "foo") == 1
+fromLeft :: a -> Either a b -> a
+fromLeft _ (Left a) = a
+fromLeft a _        = a
 
--- | The 'fromRight' function extracts the element out of a 'Right' and
---   throws an error if its argument is 'Left'.
---   Much like 'fromJust', using this function in polished code is usually a bad idea.
+-- | Return the contents of a 'Right'-value or a default value otherwise.
 --
--- > \x -> fromRight (Right x) == x
--- > \x -> fromRight (Left  x) == undefined
-fromRight :: Either l r -> r
-fromRight (Right x) = x
+-- > fromRight 1 (Right 3) == 3
+-- > fromRight 1 (Left "foo") == 1
+fromRight :: b -> Either a b -> b
+fromRight _ (Right b) = b
+fromRight b _         = b
+
+#endif
 
 #if __GLASGOW_HASKELL__ < 708
 -- | Test if an 'Either' value is the 'Left' constructor.
diff --git a/test/TestGen.hs b/test/TestGen.hs
--- a/test/TestGen.hs
+++ b/test/TestGen.hs
@@ -49,10 +49,10 @@
     testGen "findM (Just . isUpper) \"teST\"             == Just (Just 'S')" $ findM (Just . isUpper) "teST"             == Just (Just 'S')
     testGen "findM (Just . isUpper) \"test\"             == Just Nothing" $ findM (Just . isUpper) "test"             == Just Nothing
     testGen "findM (Just . const True) [\"x\",undefined] == Just (Just \"x\")" $ findM (Just . const True) ["x",undefined] == Just (Just "x")
-    testGen "\\x -> fromLeft (Left  x) == x" $ \x -> fromLeft (Left  x) == x
-    testGen "\\x -> fromLeft (Right x) == undefined" $ \x -> erroneous $ fromLeft (Right x)
-    testGen "\\x -> fromRight (Right x) == x" $ \x -> fromRight (Right x) == x
-    testGen "\\x -> fromRight (Left  x) == undefined" $ \x -> erroneous $ fromRight (Left  x)
+    testGen "fromLeft 1 (Left 3) == 3" $ fromLeft 1 (Left 3) == 3
+    testGen "fromLeft 1 (Right \"foo\") == 1" $ fromLeft 1 (Right "foo") == 1
+    testGen "fromRight 1 (Right 3) == 3" $ fromRight 1 (Right 3) == 3
+    testGen "fromRight 1 (Left \"foo\") == 1" $ fromRight 1 (Left "foo") == 1
     testGen "\\x -> fromEither (Left x ) == x" $ \x -> fromEither (Left x ) == x
     testGen "\\x -> fromEither (Right x) == x" $ \x -> fromEither (Right x) == x
     testGen "\\xs -> repeatedly (splitAt 3) xs  == chunksOf 3 xs" $ \xs -> repeatedly (splitAt 3) xs  == chunksOf 3 xs
