Maybe you were asking the more theoretical question? There are many ways of going about this sort of thing with fancy extensions. For example, a GADT can be used to restrict the type of C1 and D1 to Char -> Type1 () and Double -> Type1 () but leave the other constructors open. Thus, everything will be of type Type1 () but only the first two can be of type e.g. Type1 Bool. Here is a variant that also uses -XDataKinds, just for your amusement:
{-# LANGUAGE GADTs, DataKinds, KindSignatures #-}
{-# OPTIONS_GHC -Wall #-}
data Status = Special | Common -- This type we will 'promote' to a kind.
-- Its constructors will be used as
-- names of (memberless) types.
data Type (s :: Status) where
A :: Type s
B :: Bool -> Type s
C :: Char -> Type Common
D :: Double -> Type Common
type Type1 = Type Common -- This has the same constructors as your Type1
-- i.e. A, B, C and D
type Type2 = Type Special -- This has as many constructors as your Type2
-- but doesn't need a new declaration and wrapper
-- They are just A and B
mkGeneral :: Type2 -> Type s
mkGeneral A = A
mkGeneral (B b) = B b -- ghc -Wall sees no patterns are missing
mkCommon :: Type2 -> Type1
mkCommon = mkGeneral
mkSpecial :: Type s -> Maybe Type2
mkSpecial A = Just A
mkSpecial (B b) = Just (B b) -- ghc -Wall sees the need for the next line
mkSpecial _ = Nothing