The recovery of software architecture is a first important step towards re-engineering a software system. Architecture recovery usually involves clustering. The problem with current clustering techniques is that they decide exclusively based on syntactic dependencies instead of looking at higher-level semantic information. As a result, the recovered architecture is not always meaningful to a human software engineer. In this paper, we propose an approach that combines clustering with pattern-matching techniques to recover meaningful decompositions. Pattern-matching is used to identify architectural clues -- small structural patterns that provide semantic information to allow for a rating of the dependencies found between a system's entities. These clues are used to compute an adaptive inter-class similarity measure which is then used by a clustering algorithm to produce the final system decomposition.