diff --git a/bed-and-breakfast.cabal b/bed-and-breakfast.cabal
--- a/bed-and-breakfast.cabal
+++ b/bed-and-breakfast.cabal
@@ -1,5 +1,5 @@
 Name:           bed-and-breakfast
-Version:        0.1.3
+Version:        0.1.4
 Synopsis:       Efficient Matrix operations in 100% Haskell.
 Description:    Efficient Matrix operations in 100% Haskell.
                 .
@@ -17,6 +17,11 @@
                     no longer call `error' if a matrix is not
                     invertible. Also @Matrix@ derives 'Data.Typeable'
                     now.
+                .
+                [@v0.1.4@] Added @scale@, @<->@, and @<|>@. Corrected
+                    a bug in @isUnit@ reported by Charles Durham
+                    (would have returned True for any matrix for which
+                    @all (== 1) . trace@ would have, which is wrong).
 
 License:        MIT
 License-File:   LICENSE
@@ -24,7 +29,7 @@
 Maintainer:     Julian Fleischer <julian.fleischer@fu-berlin.de>
 Build-Type:     Simple
 Cabal-Version:  >= 1.8
-Category:       Numeric, Math
+Category:       Numeric, Math, Linear Algebra
 Stability:      stable
 Homepage:       http://hub.darcs.net/scravy/bed-and-breakfast
 
diff --git a/src/Numeric/Matrix.hs b/src/Numeric/Matrix.hs
--- a/src/Numeric/Matrix.hs
+++ b/src/Numeric/Matrix.hs
@@ -238,9 +238,11 @@
     inv _ = Nothing
 
     isZero = all (== 0)
-    isUnit m = isSquare m && P.all (== 1) (trace m)
+    isUnit m = isSquare m && allWithIndex (uncurry check) m
+        where check = \i j e -> if i == j then e == 1 else e == 0
     isEmpty m = numRows m == 0 || numCols m == 0
-    isDiagonal = allWithIndex (uncurry $ \x y z -> if x /= y then z == 0 else True)
+    isDiagonal m = isSquare m && allWithIndex (uncurry check) m
+        where check = \i j e -> if i /= j then e == 0 else True
     isSquare m = let (a, b) = dimensions m in a == b
 
     map f = mapWithIndex (const f)
