I recall that when IUpgradable was first added to the DNN framework there was a problem with its use in later versions of a module when it had not been implemented in the first version. AFAIK this and several other problems with IUpgradable was fixed many DNN versions ago.
Here are several things to check (and I suspect your already are aware of them):
1. Properly implemented the IUpgradable interface by adding Implements DotNetNuke.Entities.Modules.IUpgradable after the class declaration and Public Function UpgradeModule (ByVal version As String) As String Implements DotNetNuke.Entities.Modules.IUpgradable.UpgradeModule to the business controller class.
2. Added a <businesscontrollerclass> node to your .dnn manifest file and included the fully qualified class name in that node. If this is a WAP/compiled module, the content of the node should include the assembly name: <businesscontrollerclass>MyCompany.MyModuleNamespace.MyControllerClass, MyModuleAssemblyName</businesscontrollerclass>
3. Included in the zip package and referenced in a file node of the .dnn manifest an "xx.xx.xx.SqlDataProvider" file with xx.xx.xx representing the version number of the new upgrade. Note that even if you do not need an SqlDataProvider file for this version to make database modifications, a blank one must be included to properly trigger UpgradeModule - which will be called for each version there is a corresponding SqlDataProvider file.
4. Have you tried (after installing the new module version on the test site), opening the module's definition then clicking Update to see if IUpgradable is now properly checked?
BTW, against what version of DNN was the module developed and what is the version of DNN running on the test site?