It's not a totally unreasonable softfork. The type is already standard & valid, and there's benefits to having 100% of transactions using the same template, moves the bulk of the data to prunable TxIns, and makes TxIn scripts self-identifying.
It would help with the "ultimate blockchain compression" kind of thing.
At the moment, the UTXO set has to be stored as a map tx-out -> script.
With mandatory P2SH, you could save a hash for each output and done (20 bytes). In fact, you could just save part of the hash (8-10 bytes).
Though probably not worth the effort, and would be much more worth if we were creating a new blockchain with that rule enforced from the beginning. There's still 20 GB of blockchain that don't have that change, so the more-complex rules have to stay in the code to handle arbitrary, non-self-identifying TxIns for the first 20 GB.
It is a fixed cost. You can get around it for legacy transactions anyway.
Define a new "expanded" block and "expanded" transaction.
For an expanded transaction, you append all the non-P2SH input scripts.
An expanded block contains expanded transactions to cover non-P2SH transactions. If it is all P2SH transactions, then the block is the same as now.
For maximum security, the appended info would also need to include the paths to the merkle root.
However, since the client would already be tracking the UTXO set (as hashes) that isn't required.
The switch-over could be
After block N, all transaction outputs must be either OP_RETURN <40 bytes>, P2SH or P2SH-v2 (without the 500 byte limit)
Legacy outputs from blocks <= N still operate as per normal.
After block N + 25000 (6 months), spending them requires that the spender provide the extended transaction format.