I "solved" this problem with a particularly ugly hack. Rather than try to figure out how to get the right major mode hooks in place, I just did the following:
(defun save-buffer-without-tabs ()
(interactive)
(untabify (point-min) (point-max))
(save-buffer))
(global-set-key "\C-x\C-s" 'save-buffer-without-tabs)
This horribly breaks some things (that I care about, those things are Python and Makefiles). Thus, I also did the following:
;; restore the original save function for makefiles
(add-hook 'makefile-mode-hook
(lambda ()
(define-key makefile-mode-map "\C-x\C-s" 'save-buffer)))
;; restore the original save function for python files
(add-hook 'python-mode-hook
(lambda () (define-key python-mode-map "\C-x\C-s" 'save-buffer)))
I wasn't aware of the after-change-major-mode-hook
mentioned by Thomas, but if his solution doesn't work for you for some reason, I've been using this for a few years now without incident.
Edit: Upon closer inspection, I don't think you're asking exactly the question I answered. I guess nuking all the tabs is one way to get consistent indentation. :)