1. The reason they existed in the first place was as a convenience when there were no concrete time zone types in the standard library.
2. Adding the `tz` argument to `now` and `timestamp` has provided a more general solution to the problem anyway.
3. They create objects that are inconsistent with the way Python treats naive datetimes, since naive datetimes are supposed to be abstract representations of a time, and if they need to be treated as a concrete time, they are taken to be local times.
The one advantage `datetime.utcnow()` has is that it is somewhat faster than `datetime.now(tz=timezone.utc)`