The hash of any given block guarantees the integrity of every previous block and the merkle tree guarantees the integrity of all transactions in those blocks. So couldn't we skip validation (other than the hashes/merkle) for everything up to the last checkpoint?
In the C++ the slow part is the indexing and data structure maintenance rather than the block integrity checks. If you want to run a full node you can't avoid it.
For a lightweight/client-mode/SPV implementation yes you can skip earlier blocks if you have an empty wallet and I plan to implement that optimization at some point in BitCoinJ.