carefully navigate types through different stages