Actually, things were more broken than I thought. The original code did not handle correctly directory copy from local to remote either. The reason is function
tramp-make-copy-program-file-name
already quotes the target, and then shell-quote-argument quotes the target again, so we get double quotes.
I attached a second patch to fix both copying dir from local to remote, or remote to local. However, I am not so sure if this is a completely correct fix as I don't know much about the "multi-hop" thing. Anyway, hope this can serve as a starting point for the ultimate proper fix.
BTW, all the above works out of box on Emacs 23.3.
To be honest, I am quite disappointed with Emacs recent (last 2 or 3 years) release quality. Seems some convoluted low-quality code was checked in the first place, and then not enough testing was done before release. Don't know if I have any right to complain in the first place as I am not an active developer here. But I would hate to see my favorite editor Emacs going down this path further.