父親は東京都板橋区、母親は兵庫県神戸市出身で、父が終戦後、満州からの妻の疎開先・宮城県宮崎村に引き揚げ、仙台市に移り住んだ後、潤一が生まれた。仙台市立東華中学校を経て、宮城県工業高等学校卒業。中学に入り本格的なバンド活動を始め、仙台にて「フェイセス」を結成。その後、仙台のライブハウスや横須賀や立川の米軍キャンプ等で演奏を続けるうち、｢スーパーポップボーカル｣というキャッチコピーで1982年（昭和57年）に「雨のリグレット」でデビュー。以降、次々とヒットを飛ばす。現在では自作曲もあるが、そのレパートリーは他の作詞・作曲家提供による楽曲がほとんど。その後もシングルのタイトル曲は自作していない。1984年には俳優・神田正輝のシングル「マティーニの後で」のＢ面「ひき潮」の作曲を担当した。「思い出のビーチクラブ」（1987年カナダドライ・ジンジャーエール）、「セブンティ・カラーズ・ガール」（1989年初春のカネボウ化粧品）、「APRIL」（1986年三洋電機）などのCMソングも多数。デビュー当初は、東芝EMIとの契約だったが、後にファンハウス（現：アリオラジャパン）に移籍し、ファンハウスを傘下にする前のBMGビクター・BMGジャパンを、さらにテイチク傘下のコンチネンタル・レーベルを経て、やはりテイチクエンタテインメント傘下のインペリアルレコードに所属。2007年より、ユニバーサルミュージック・USM JAPANレーベルに移籍。なお、BMG（air Records）時代のものを除き（2013年にソニー・ミュージックダイレクトから再発されている）、Imperial Records時代までの楽曲の原盤権はフジパシフィック音楽出版が管理しており、2008年（平成20年）にUSM JAPANレーベルからファンハウス以前のアルバムが再発された際には、フジパシフィック音楽出版のライセンシーによりリリースされている。映画『アイ・ラヴ・ユー』の音楽監修も務め、主題歌・挿入歌を担当している（挿入歌は、同じくテイチク所属のSALAHも担当）。既婚だが、最初の妻とは死別している。2009年（平成21年）一般女性と再婚。同年3月14日内輪のみパーティーを済ませ、挙式も済ませている。2006年（平成18年）には声優・長谷川杏里のデビューシングル「フラグメンツ・ブルー」の作曲を担当した。稲垣の地元、仙台市を本拠地とする東北楽天ゴールデンイーグルスのファンクラブ名誉会員（会員No.11）であり、2007年（平成19年）3月31日フルキャストスタジアム開幕戦（日本ハム戦）で国歌独唱を行った。2013年に日本最高峰のSUPER GTのGT300クラスのGREEN TEC RACING TEAMの監督に就任した。自身も公式ライセンスを取得しており、かつてはトヨタ・アルテッツァのワンメイクレース「ネッツカップ・アルテッツァワンメイクシリーズ」等に参戦するなど、モータースポーツへの造詣が深い。元々はドラマーであり、ドラムを演奏しながら歌うことがライブやテレビ出演で見られる。ドラムはTAMAとエンドースメント契約を結んでいる。
クラスの定義構文は、従来のPascalにおけるrecord（C言語の構造体に相当）の定義構文を拡張したものである。クラス型の要素として変数以外にも手続きや関数を書けるようになっている。クラスに属する変数はフィールド（C++のメンバ変数に相当）、また手続きおよび関数はメソッド（C++のメンバ関数に相当）と呼ばれ、通常の変数、手続きおよび関数と区別される。また、クラスの属性であるフィールドにアクセスする際に、冗長なメソッドを用いるのではなく、より簡潔に記述するための仕組みとして、プロパティと呼ばれる構文が用意されている。プロパティを用いることで、オブジェクト指向のカプセル化を維持しつつ、あたかもフィールドに直接アクセスしているかのような直感的な記述でクラスの属性を操作することが可能となる。メソッドの実装は(クラス名).(メソッド名)という形で記述する。例:program MyObjectPascalTest;type  TMyBaseClass = class  private    Fa: Integer;    Fb: Integer;  public    procedure SetValueA(v: Integer);    function GetValueA: Integer;    property ValueB: Integer read Fb write Fb; // 読み書き両方が可能なプロパティ。    procedure DoSomething; virtual; abstract;  end;  TMySubClass = class(TMyBaseClass)  public    procedure DoSomething; override;  end;procedure TMyBaseClass.SetValueA(v: Integer);begin  Fa := vend;function TMyBaseClass.GetValueA: Integer;begin  Result := Faend;procedure TMySubClass.DoSomething;begin  WriteLn('TMySubClass.DoSomething is called.');  WriteLn('ValueA = ', GetValueA);  WriteLn('ValueB = ', ValueB)end;var  obj: TMyBaseClass;begin  obj := TMySubClass.Create; // オブジェクトの生成。  obj.SetValueA(100);  obj.ValueB := -5;  obj.DoSomething; // 派生クラスでオーバーライドされたメソッドが実行される（ポリモーフィズム）。  obj.Free; // オブジェクトの解放。  obj := Nilend.クラス名は慣例的にTypeを意味する 'T' で始められることが多く、フィールド名は慣例的に 'F' で始められることが多い。type TX = class の構文は、Systemユニットで定義されている基底クラスTObjectから暗黙的に派生することを意味する。type TB = class(TA) の構文において、クラスTAはTObjectそのものであるか、あるいはTObjectから派生している必要がある。一方、type TB = object(TA) の構文を使用することで、TObjectから派生せず、組み込みのコンストラクタやデストラクタなどのメソッドをサポートしないオブジェクト型の宣言を行なうことができるが、DelphiやAppmethodにおいては下位互換性を保つ目的でのみ残されており、オブジェクト型の使用は推奨されていない。クラスの定義にユニット (unit) を用いる場合、クラスの宣言は interface 部に、メソッドの実装は implementation 部に記述する。例:unit MyUnit;interfacetype  TMyClass = class  public    procedure Proc;  end;implementationprocedure TMyClass.Proc;begin  { ここに実装を記述 }end;end.