Alter element_info and troubleshoot changed elements
The underlying problem was caching. I thought I had cleared cache, but apparently not.

Here are answers to my questions: 

As suggested above, use watchdog() to see the value of the $type array. Here is a (probably dangerous) snippet: 

watchdog('customcode', 'uc_price after mod: &lt;pre&gt;'. 
print_r($type['uc_price'], TRUE) . '&lt;/pre&gt;');


hook_element_info_alter is how I want to modify the element, and the function should replace hook with the name of the custom module. 

It looks as if all hook_element_info_alter hooks are called after all type elements are defined somehow, but I am still fuzzy on this. 

I am not certain when hook_element_info_alter is called, but it appears to be called early (there is no need to visit the form in question) and it appears to be cached for a long time. 

My strategy of setting #allow_negative to TRUE was in fact the right approach, because the validation function uc_store_validate_number takes this into account. Otherwise I would have had to unset the validation function and replace it with a custom one.