I think this is a good way to handle things, but as you say, it is a hard fork.

CHECKLOCKTIMEVERIFY covers many of the use cases, but it would be nice to fix malleability once and for all.

This has the effect of doubling the size of the UTXO database.  At minimum, there needs to be a legacy txid to normalized txid map in the database.

An addition to the BIP would eliminate the need for the 2nd index.  You could require a SPV proof of the spending transaction to be included with legacy transactions.  This would allow clients to verify that the normalized txid matched the legacy id.

The OutPoint would be {LegacyId | SPV Proof to spending tx  | spending tx | index}.  This allows a legacy transaction to be upgraded.  OutPoints which use a normalized txid don't need the SPV proof.

The hard fork would be followed by a transitional period, in which both txids could be used.  Afterwards, legacy transactions have to have the SPV proof added.  This means that old transactions with locktimes years in the future can be upgraded for spending, without nodes needing to maintain two indexes.