Instead of checkpoints, client could hard-code a MAIN_CHAIN_MIN_POW variable. This would be the PoW of the main chain when that version of the client was released. All clients wouldn't need to agree on a value. It is just a spam protection value.
Clients should download headers first and only commit blocks to disk that are on a chain that has PoW higher than the hard coded minimum.
I like this idea - it doesn't contradict decentralized principle (as checkpoints do).