Doesn't seem like a horrible idea, but my kneejerk reaction is that it's a little too much work for a halfway solution that wouldn't be useful code for the longterm solution.
Stroke of Genius:: Stacks are currently 2 things. First, they serve as a optimization 'class' for the code to abstract information about a set of things that are A: all created at the same time, and B: Have the same set of information (creator, age, images, quality, etc). The second is to serve as a physical grouping for objects in the game world. (There's 30 coins in my pocket). Why not separate those functions?
Technical Coding stuff
When a group of objects is created, create the 'stack' listing for them in the 'created_objects' data.
Then create a Stack 2.0 object with a pointer to the created object and a count (30, arrows).
The stack 2.0 object would be typed (Gold Coins, Arrows, whatever), and contain an array of pointers to the objects it contains. That way, you are separating the two functions (aggregate stack data and aggregate physical objects into a managable set.) I understand that there are some limitations to this (things rot faster in the sun comes to mind), but it's a good start on implementation...
Anyway, this would still require the hinted at total rewrite of the way dwarves think about stacks, but it's a pretty elegant way to do it. You wouldn't be treating a stack of similar items as any different from a pocket full of disparate coins.
Also, the item specific stacks could contain some totally awesome optimization. Think about the 'Get Best Arrow' function for a stack of bolts for real fights versus 'Get Worst' for training. 'Get Value' for a stack of coins wouldn't care what metal the coins were from.