I’m Mike’s coworker, and we worked out a solution.
The type X is defined in his assembly, that is only in the GAC. Even though his ASP.NET web appplication did have a reference, it was failing to load from the GAC only for this UserControl. The rest of the application worked as expected. We confirmed the failed loading by placing a copy of the assembly in the bin directory, and everything worked. We removed the assembly, and the problem came back.
Our solution was to manually add an entry to the web.config in the assemblies section to point ASP.NET to the GAC.
It looks like any time you reference a type in the page (not the code-behind), you need the assembly information defined in the web.config file or in a page directive.
<assemblies>
<add assembly="MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[MyPublicKeyToken]"/>
</assemblies>