I think this is the uncommon case, and deserves the parentheses:
x <- (if y then a else b) ;

It's not the uncommon case... It's what's the ?: operator for C++ and Java. I guess it's very common indeed.

I think I'm arguing that the precedence of if/then/else is too high, and
maybe should be lowered.  Of course this isn't a reasonable thing to
ask, because it'll likely break existing code.  Anyone with a way to
have my cake and eat it too?


Look at nemerle [1], I believe they have the if/then/else construct with the else clause mandatory, and for cases where in OCaml it is ommited, they would use the when keyword. This solves your problem:

if y=1 then
       print_int y;
       print_int 2;
else
       print_string "not one"

is same as

if y=1 then
       ( print_int y;
       print_int 2; )
else
       print_string "not one"

but

when y=1 then
       print_int y;
       print_int 2;

would be (in OCaml)

(if y=1 then print_int y); print_int 2