But it you want to share string and regexp histories, it's easy to implement
by another layer of indirection like for query-replace history variables:
(defcustom query-replace-from-history-variable 'query-replace-history
(defcustom query-replace-to-history-variable 'query-replace-history
Sure. It's possible to make this behavior customizable.
But then perhaps search-ring-yank-pointer and regexp-search-ring-yank-pointer
need similar indirection, or code could be smart enough to detect such
indirection and compute the right pointer depending on where such variables
point to.
I really think you're over-thinking this problem. Let's just try a unified
history and see whether it causes problems in practice. I suspect it'll
feel perfectly natural, and we won't need complex indirection layers.