diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,11 @@
 # Changelog for the [`clash-lib`](http://hackage.haskell.org/package/clash-lib) package
 
+## 0.6.3 *October 24th 2015*
+* New features:
+  * Improve DEC transformation: consider alternatives before the subject when checking for disjoint expressions.
+* Fixes bugs:
+  * DEC: don't generate single-branch case-expressions [#90](https://github.com/clash-lang/clash-compiler/issues/90)
+
 ## 0.6.2 *October 21st 2015*
 * Fixes bugs:
   * DEC: Subject and alternatives are not disjoint [#88](https://github.com/clash-lang/clash-compiler/issues/88)
diff --git a/clash-lib.cabal b/clash-lib.cabal
--- a/clash-lib.cabal
+++ b/clash-lib.cabal
@@ -1,5 +1,5 @@
 Name:                 clash-lib
-Version:              0.6.2
+Version:              0.6.3
 Synopsis:             CAES Language for Synchronous Hardware - As a Library
 Description:
   CλaSH (pronounced ‘clash’) is a functional hardware description language that
diff --git a/src/CLaSH/Netlist.hs b/src/CLaSH/Netlist.hs
--- a/src/CLaSH/Netlist.hs
+++ b/src/CLaSH/Netlist.hs
@@ -199,7 +199,7 @@
                                         -- When element and subject have the same HW-type,
                                         -- then the projections is just the identity
                                         | otherwise      -> Just (DC (Void,0))
-        _ -> Nothing
+        _ -> error $ $(curLoc) ++ "Not in normal form: Unexpected pattern in case-projection: " ++ showDoc e
       extractExpr = Identifier (maybe altVarId (const selId) modifier) modifier
   return (decls ++ [Assignment dstId extractExpr])
 
diff --git a/src/CLaSH/Normalize/DEC.hs b/src/CLaSH/Normalize/DEC.hs
--- a/src/CLaSH/Normalize/DEC.hs
+++ b/src/CLaSH/Normalize/DEC.hs
@@ -1,6 +1,7 @@
 {-# LANGUAGE DeriveFoldable    #-}
 {-# LANGUAGE DeriveFunctor     #-}
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecursiveDo       #-}
 {-# LANGUAGE TemplateHaskell   #-}
 {-# LANGUAGE TupleSections     #-}
 {-# LANGUAGE ViewPatterns      #-}
@@ -51,8 +52,9 @@
 import qualified Data.Set                         as Set
 import qualified Data.Set.Lens                    as Lens
 
-import           Unbound.Generics.LocallyNameless (Bind, bind, embed, rec,
-                                                   unbind, unembed, unrec)
+import           Unbound.Generics.LocallyNameless (Bind, bind, embed, fv, unbind,
+                                                   unembed, unrec)
+import qualified Unbound.Generics.LocallyNameless as Unbound
 
 -- internal
 import CLaSH.Core.DataCon    (DataCon, dcTag)
@@ -116,10 +118,10 @@
   -> RewriteMonad NormalizeState
                   (Term,[(Term,CaseTree [(Either Term Type)])])
 collectGlobals inScope substitution seen (Case scrut ty alts) = do
-  (scrut',collected)  <- collectGlobals     inScope substitution seen scrut
-  (alts' ,collected') <- collectGlobalsAlts inScope substitution
-                                            (map fst collected ++ seen)
-                                            scrut' alts
+  rec (alts' ,collected)  <- collectGlobalsAlts inScope substitution seen scrut'
+                                                alts
+      (scrut',collected') <- collectGlobals inScope substitution
+                                            (map fst collected ++ seen) scrut
   return (Case scrut' ty alts',collected ++ collected')
 
 collectGlobals inScope substitution seen e@(collectArgs -> (fun, args@(_:_)))
@@ -149,7 +151,7 @@
   (lbs',collected')   <- collectGlobalsLbs inScope substitution
                                            (map fst collected ++ seen)
                                            lbs
-  return (Letrec (bind (rec lbs') body')
+  return (Letrec (bind (Unbound.rec lbs') body')
          ,map (second (LB lbs')) (collected ++ collected')
          )
 
@@ -262,7 +264,7 @@
         disJointSelProj argTys cs''
     let newArgs = mkDJArgs 0 common uncommonProjections
     case uncommonCaseM of
-      Just lb -> return (Letrec (bind (rec [lb]) (mkApps fun newArgs)))
+      Just lb -> return (Letrec (bind (Unbound.rec [lb]) (mkApps fun newArgs)))
       Nothing -> return (mkApps fun newArgs)
 
 -- | Create a single selector for all the representable uncommon arguments by
@@ -350,7 +352,14 @@
         _ -> head tms
 
     go (LB lb ct) =
-      Letrec (bind (rec lb) (go ct))
+      Letrec (bind (Unbound.rec lb) (go ct))
+
+    go (Branch scrut [(p,ct)]) =
+      let ct' = go ct
+          alt = bind p ct'
+      in  case Lens.setOf termFreeIds ct' == Lens.setOf fv alt of
+            True -> ct'
+            _    -> Case scrut ty [alt]
 
     go (Branch scrut pats) =
       Case scrut ty (map (\(p,ct) -> bind p (go ct)) pats)
diff --git a/src/CLaSH/Rewrite/Types.hs b/src/CLaSH/Rewrite/Types.hs
--- a/src/CLaSH/Rewrite/Types.hs
+++ b/src/CLaSH/Rewrite/Types.hs
@@ -8,8 +8,9 @@
 
 import Control.Concurrent.Supply             (Supply, freshId)
 import Control.Lens                          (use, (.=), (<<%=))
-import Control.Monad.Reader                  (MonadReader (..))
 import Control.Monad
+import Control.Monad.Fix                     (MonadFix (..), fix)
+import Control.Monad.Reader                  (MonadReader (..))
 import Control.Monad.State                   (MonadState (..))
 import Control.Monad.Writer                  (MonadWriter (..))
 import Data.HashMap.Strict                   (HashMap)
@@ -135,6 +136,9 @@
    ask       = R (\r s -> (r,s,mempty))
    local f m = R (\r s -> runR m (f r) s)
    reader f  = R (\r s -> (f r,s,mempty))
+
+instance MonadFix (RewriteMonad extra) where
+  mfix f = R (\r s -> fix $ \ ~(a,_,_) -> runR (f a) r s)
 
 -- | Monadic action that transforms a term given a certain context
 type Transform m = [CoreContext] -> Term -> m Term
