Если вы хотите, чтобы сопоставление с образцом предоставило подтверждение для параметра типа, вы можете использовать GADT:
{-# LANGUAGE GADTs #-}
data PT1
data PT2
data Tag a where
PT1 :: Tag PT1
PT2 :: Tag PT2
data DT1 a = DT1 { tag :: Tag a, field :: Int }
newtype DT2 a = DT2 (DT1 a)
f :: Int -> DT2 a -> Int
f x (DT2 (DT1 PT1 field)) = 5
f x (DT2 (DT1 PT2 field)) = 7
Но теперь этот тип больше не является фантомным - вы носите с собой тег времени выполнения.
Я не уверен, какое это имеет преимущество перед тем, что предложил @ sepp2k, или даже если это будет полезно. Он просто дает вам то, о чем вы просили, с небольшим изменением вашего примера кода: -)