Object-oriented languages offer one promising approach to making programs easier to write and easier to modify and extend. Unfortunately, object-oriented language constructs often incur a substantial run-time cost. To improve the run-time performance of object-oriented languages, previous research applied intraprocedural class analysis and compile-time class prediction to determine the actual classes of arguments to a dynamically bound call at compile-time, thereby statically binding the call to the target procedure and enabling inline expansion to eliminate the overhead of the call. This work was performed primarily in the context of purely object-oriented languages. The goal of this project is to extend previous work in three directions. First, the scope of analysis will be expanded to the whole application program. This necessitates developing and evaluating techniques for constructing call graphs for object-oriented languages and performing interprocedural class analysis. Second, profile information will be incorporated into the analysis and optimization process. In particular, profile information can provide much more accurate class prediction information than can static estimation techniques. Third, procedure specialization will be selectively applied to the optimization of object-oriented languages. The goal will be to investigate the relative trade-offs in cost and benefit among inline expansion, procedure specialization, and interprocedural analysis for object-oriented languages. The suitability of these techniques across a range of object-oriented programming languages, both pure and hybrid, will be evaluated in this effort.