According to MRI folks, this is not a bug. I reluctantly agree with them, though I think the behavior is surprising.
A block with arguments like |a, b| behaves the same way as a method like def foo((a, b)) where the extra () is spreading out a single incoming argument into multiple arguments for distribution to a, b. However, a single-argument block |a| does not do any spreading and behaves like a method def foo(a), i.e. normal 1:1 argument assignment.
Given block arguments' roots in multiple assignment, and the behavior of 1.8 block arguments, this behavior is somewhat consistent if you ignore the inconsistency of spreading the incoming array only in multiple arguments' case.
We will not be able to fix this for JRuby 1.7, because the block dispatch paths are still very much oriented toward 1.8 behavior. All attempts I have made to patch for this specific case have failed, because they either cause too many other cases to unwrap, or they cause the single arg case to spread the array. We need to be able to focus exclusively on 1.9 behavior throughout block dispatch to make this work right, which won't happen until JRuby 9k.