diff --git a/ghc/compiler/types/Type.lhs b/ghc/compiler/types/Type.lhs
index bd502b56fdab11114074b992da5f397f3339cef0..8271ce32f389168eac64f3219f2002b90aef3ae9 100644
--- a/ghc/compiler/types/Type.lhs
+++ b/ghc/compiler/types/Type.lhs
@@ -835,9 +835,16 @@ isUnboxedType :: Type -> Bool
 isUnboxedType ty = not (isFollowableRep (typePrimRep ty))
 
 isUnLiftedType :: Type -> Bool
-isUnLiftedType ty = case splitTyConApp_maybe ty of
-			   Just (tc, ty_args) -> isUnLiftedTyCon tc
-			   other	      -> False
+	-- isUnLiftedType returns True for forall'd unlifted types:
+	--	x :: forall a. Int#
+	-- I found bindings like these were getting floated to the top level.
+	-- They are pretty bogus types, mind you.  It would be better never to
+	-- construct them
+
+isUnLiftedType (ForAllTy tv ty) = isUnLiftedType ty
+isUnLiftedType (NoteTy _ ty)	= isUnLiftedType ty
+isUnLiftedType (TyConApp tc _)  = isUnLiftedTyCon tc
+isUnLiftedType other		= False
 
 isUnboxedTupleType :: Type -> Bool
 isUnboxedTupleType ty = case splitTyConApp_maybe ty of