Patching builtins sometimes works, but it's inviting unexpected behavior. If you're trying to mix symbols with explicit arrays, it's probably better to wrap the arrays in a function that prevents Listable from operating. The actual wrapper doesn't matter as long as it's passive, but MatrixForm is convenient, and makes pretty output, too. Try this:
ab = MatrixForm[{a, b}]
3*ab + ab
And then, to unwrap, just do something like:
% /. MatrixForm -> Identity